数据在内存中的存储,超详解

目录

关于整形提升

 浮点数的存储方式


  我将自己对于数据在内存中的存储的理解写一篇博客以供大家参考。

我觉得还是边写代码边解释吧,这样可以边看代码边想问题,比较方便一点。

关于整形提升

先来解释以下上边的这个代码,数字在内存中的存储,存储的是二进制补码

-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的补码(正整数的补码反码原码都是一样的)所以陷入了死循环。

 

 用画图来表示(出自比特鹏哥):

 浮点数的存储方式

        

 以下是对于浮点数在内存中存储的规定:

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值