Part1.整形在内存中的存储
1.整形的存储方式
整形在内存中以补码的形式存储,使用补码可以将符号位和数值域统一处理;同时补码和原码可以相互转换,运算过程是相同的,不需要额外的转换
补充:正整数的原码,反码,补码是相同的了,而对于负整数来说,三种表示形式各不相同;
原码:直接将数值按照正负数的形式翻译成二进制编码
反码:原码中的1转换成0,0转换成1即可得到反码
补码:将反码+1即可得到补码
2.字节存储的两种方式
字节在数据中存储的时候有两种不同的存储方式,我们将这两种不同的存储方式称为大端字节序和小端字节序。
①大端字节序
我们知道,整形数据内存的存放是从高地址向低地址存放的,高地址存放高位,低地址存放低位。而大端字节序类似,数据的低位字节存放在高地址,数据的高位字节存放在低地址
②小端字节序
存储方法类似于大端字节序,数据的低位字节存放在低地址,高位字节存放在高地址,与大端字节序的存放方式正好相反。
3.一些例子
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
代码运行结果如下
我们来分析一下这个代码:三个变量a,b,c其中a是一个字符型,b是一个有符号字符型,c是一个无符号字符型。在打印这三个变量的时候,我们需要注意这三个变量的范围,其中signed char的表示范围是-128-127,unsigned char的表示范围是0-255。
我们赋给a的值为-1,其原反补码如下
而char只能存8个bit位,故存放的为 11111111。%d打印的为有符号的整数,这里我们需要将其整型提升,提升为32位的补码如下。
最后我们将其转换成原码输出,故a和b的输出值为-1。
对于c这种无符号数,我们将其整形提升后的32位原,反,补码如下(无符号数的原,反,补码相同),故c的输出值为255。
Part2.浮点数在内存中的存储
其中IEEE 754规定:
对于32位的浮点数,最高的1位存储符号位S,后面8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最高的1位存储符号位S,后面11位存储指数E,剩下的52位存储有效数字M
①浮点数的存储过程
1.对于M
在计算机内部保存M的时候,我们默认第一位为1并将其舍去,这样可以保留更多位有效数字,等到读取的时候再把舍去的第一位的1加上。
2.对于E
E是一个无符号整数,其表示为2的指数形式,存入内存时,E的真实值必须再加上一个中间数。
②浮点数的取出过程
1.E不全为0或不全为1
指数E的计算值减去127或1023,得到真实值,再将有效数字M前加上舍去的第一位的1。
2.E全为0
指数E等于1-127或1-1023即为真实值,有效数字M不需要加上舍去的第一位的1,而是将其还原为0.×的小数。
3.E全为1
若有效数字M全为0,则表示加减无穷大,加减取决于符号位s
言尽于此,本次总结就到这里了,希望对大家有所帮助