回忆:
之前学习了基本内置类型:
char 字符数据类型(1字节);short 短整型(2字节);
int 整型(4字节);long长整型(4or8字节);long long 更长整型(8or16字节);
float 单精度浮点数(32位-4字节);double 双精度浮点数(64位-8字节)
一、整型在内存中的存储
重点:
1.在vs里char是signed char(范围—128-127)负比正多一
unsigned char(范围0-255)
2.大小端字节存储:
(1)字节序–是以字节为单位,讨论存储顺序的
(2)小端字节序存储:把一个数据的低位字节的内容,存放在低地址处,把一个数据的高位字节的内容,存放在高地址处。
大端字节序存储:把一个数据的低位字节的内容,存放在高地址处,把一个数据的高位字节的内容,存放在低地址处。
示例:
int main()
{
char a = -1;
signed char b = -1;
//负数整型提升,高位补一;正数整型提升,高位补零
unsigned char c = -1;
//无符号的整型提升,高位补零
unsigned char d = -2;
printf("%d %d %d %d\n", a, b, c,d);
//%d-十进制的形式打印有符号型整数
char e = -128;
//-128
//10000000 00000000 00000000 10000000原码
//11111111 11111111 11111111 01111111反码
//11111111 11111111 11111111 10000000补码
//-128的补码
printf("%u\n", e);
char f = 128;
//00000000 00000000 00000000 10000000原码
//01111111 11111111 11111111 01111111反码
//01111111 11111111 11111111 10000000补码
printf("%u\n", f);
//%d-十进制的形式打印无符号型整数
//发生整型提升
int i = -20;
//1000000 00000000 00000000 00010100原码
//1111111 11111111 11111111 11101011反码
//1111111 11111111 11111111 11101100补码
unsigned j = 10;
//0000000 00000000 00000000 00001010原反补相同
printf("%d\n", i + j);
unsigned int k;
//如果是int k,再减减就为-1,就不会>=0了
for (k = 9; k >= 0; k--)
{
printf("%u\n", k);
Sleep(1000);//单位毫秒
}
return 0;
}
3.strlen是求字符串长度的,统计的是\0之前出现的字符的个数,\0的ASCII码值是0.
4.整型的类型,表示范围:limits.h
二、浮点型在内存中的存储
重点:
整型和浮点型在内存中的存储是有差异的
根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
表示符号位,当S=0,V为正数,当S=1,V为负数
- M表示有效数字,大于等于1,小于2
表示指数位
即:十进制的5.5,可以表示为二进制的101.1,相当于
按V的格式,得出S=0,M=1.011,E=2
例:
int main()
{
float f = 5.5;
//101.1
//1.011*2^2
//(-1)^0*1.011*2^2
//S=0
//M=1.011
//E=2
//0(符号S,占1bit)10000001(E的2+127=129化二进制,占8bit)011 0000 0000 0000 0000 0000(M共占23bit,.前1省略) (在32位浮点数下)
//重新整合
//0100 0000 1011 0000 0000 0000 0000 0000
//0x40b00000(16进制,小端存储)
return 0;
}
(1)以整数去存储,浮点数去读取
(2)以浮点数去存储,整数去读取
例
int main()
{
int n = 9;
//0000 0000 0000 0000 0000 0000 0000 1001
//0 0000 0000 0000000 00000000 00001001
//S E M
//0 -126 0.00000000 00000000 0001001
//(-1)^0*0.00000000 00000000 0001001*2^-126
// (+—无穷接近于0)
//E在内存中是全零
float* pfloat = (float*)&n;
printf("n的值为:%d\n", n);//9
printf("*pFloat的值为: %f\n", *pfloat);//0.000000
*pfloat = 9.0;//以浮点数去存储
//1001.0
//1.001*2^3
// (-1)^0*1.001*2^3
// S=0 M=1.001 E=3
// 0 10000010 00100000 00000000 0000000
//
printf("num的值为:%d\n", n);//1091567616(整型去解读)
printf("*pFloat的值为:%f\n", *pfloat);//9.000000
return 0;
}