数据在内存中的存储,超详解
目录
我将自己对于数据在内存中的存储的理解写一篇博客以供大家参考。
我觉得还是边写代码边解释吧,这样可以边看代码边想问题,比较方便一点。
关于整形提升
先来解释以下上边的这个代码,数字在内存中的存储,存储的是二进制补码
-1的原码: 10000000000000000000000000000001
-1的反码: 11111111111111111111111111111110
-1的补码: 11111111111111111111111111111111
在VS中:char->signed char
这里还涉及一个整形提升(因为以%d(整形格式)打印):
char a=-1在内存中的存储:11111111
signed char b=-1在内存中的存储:11111111
unsigned char c=-1在内存中的存储:11111111
整形提升后:a,b在内存中存的32位补码都是:11111111111111111111111111111111
由于定义c是无符号的(整型提升补的是0):00000000000000000000000011111111
所以 a=b=-1 ; c=256-1=255
接下里分析这一段代码(我只写了代码,int main ,头文件之类的没截到):
%u:以无符号整形打印。
-128的原码时:10000000000000000000000010000000
反码:11111111111111111111111101111111
补码:1111111111111111111111110000000
由于代码是char a=-128,整形提升后:1111111111111111111111110000000
128的补码 00000000000000000000000010000000
a->10000000
整形提升后:1111111111111111111111110000000
-20的原码:10000000000000000000000000010100
-20的反码:11111111111111111111111111101011
-20的补码:11111111111111111111111111101100
10的补码: 00000000000000000000000000001010
-20的补码+10的补码:11111111111111111111111111110110
-20的补码+10的补码取反:10000000000000000000000000001001
-20的补码+10的补码取反+1:10000000000000000000000000001010 = -10
这是一个死循环:
由于i是无符号整形(最高位不表示符号)
如果是int 类型(有符号)0-1=-1,-1的补码是 11111111111111111111111111111111
然而现在是无符号整形,最高位(在这里是最左边)的那个1不是负号,而是正整数1;所以相当于2的32次方-1=4294967295的补码(正整数的补码反码原码都是一样的)所以陷入了死循环。
用画图来表示(出自比特鹏哥):
浮点数的存储方式
以下是对于浮点数在内存中存储的规定: