一.整数在内存中的存储
整数在内存中存储的是补码。
1.补码是什么?
答:反码+1得到补码。反码由原码符号位不变,其他位取反得到。
2.为什么整数在内存中由补码储存?
答:使用补码,可以将符号位和数值域统⼀处理。同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
二.大小端字节序和字节序判断
1.大小端的定义
大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。
举个例子:0x11223344在大端存储上是这样的:11 22 33 44。
小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存 在内存的高地址处。
举个例子:0x11223344在小端存储上是这样的:44 33 22 11。
2.判断大小端的方法
问题:写一个代码确定当前机器是大端还是小端?
int check_sys()
{
int i = 1;
return (*(char*)&i);
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
解释:取i的地址,将i的地址转换成char*类型,然后解引用,取得是第一个字节。如果是1,说明是小端存储,如果是0,说明是大端存储。
三.浮点数存储
1.二进制浮点数的表示
二进制浮点数的表示:V = (−1) ^S ∗ M ∗ 2^E。其中(-1)^S为符号位,M为>=1且<2的有效数字,2^E是位数。
举个例子:5的二进制浮点数存储用上面的方式表示为1.01∗2^2(二进制表示为101)M是1.01,E是2,S是0。-5的表示为-1.01∗2^2。其中S不一样,S是1。
2.在不同位的环境下浮点数的存储
在32位
最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。
在64位
最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。
3.浮点数存的过程
对M
由于M是>=1且<2,所以M在存储的时候会将1舍弃,只存后面的小数部分,等到读取的时候在加上。这么做的目的是节省空间。
对E
因为科学计数法E可能是负数,所以在存储的时候会加上一个中间数。对于8位E,中间数是127;对于11位E,中间数是1023。
E从内存中被取出的三种情况
第一种:E不全为0或不全为1
正常存储。将E减掉中间值得到真实值,在将M的1给加上
第二种:E全为0
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,而是还 原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
第三种:E全为1
如果有效值M全为0,可以表示±无穷大。