整数在内存中的存储:
整数的二进制表示方式有三种:原码反码补码,这三种表示方式都有符号位(最高位,0为正,1为负)和数值位(除去最高位后的其他位)
对于整数来说,数值的存储方式时补码(可以将符号位和数值位统一处理),超过一个字节的数据在存储时存在存储顺序的问题,存储方式分为大端字节序存储和小端字节序存储.
大端字节序存储;数据的低位字节内容保存在内存的高地址处,高位字节内容保存在低地址处.
小端字节序存储同理.
我们可以通过代码判断当前机器为大端存储还是小端存储:
int main()
{
int a = 1;
char* p = (char*)&a;
if(*p == 1)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
浮点数在内存中的存储:浮点数的存储方式与整形不同,任何一个二进制浮点数v都可以表示为(-1)的s次方*M*2的E次方
-1的s次方为符号位,
M是有效数字(1<=M<2),
2的E次方表示指数位
因此对于32位浮点数(float),最高位存储s,接着8位存储E,剩下23位存储M
对于64位浮点数(double),最高位存储s,接着11位存储E,剩下52位存储M
考虑到E的真实值可能位负,但规定的E为无符号整形,因此存储E是需要加入一个中间值
对于8位的E为127, 对于11位的E位1023
浮点数取出的过程:
1.E不全为0或不全为1时:
指数E的值等于1-127(或1-1023),得到真实值再将有效数字M前加上第一位的1
2.E全为0时:
此时E为-127(或-1023),有效数字M前不再加1,而是还原为0.xxxx小数,这样做是为了表示±0或无限接近于0的小数
3.E全为1时:
此时有效数字M全为0,表示±无穷大(符号取决与s位)
受限于位数,部分浮点数在内存中可能无法精确保存,而double类的精度高于float类
因此,浮点数比较大小时,直接用==号可能存在问题,因此可以使用if语句限定误差在可接受范围内.