【数据存储结构】int32的二进制存储形式

1.事情起因

最近刷leetcode遇到了10进制转换2进制相关的问题,当遇到负数的时候发现跟思考的不一样,-1并不是 1000 ... 0001,而是1111 ... 1111,究其原因是负数以补码形式存储在4个byte中,这是与正数存储原码不同的地方,遗忘已久的最底层知识由回来了。

2.int32正数在4个byte中的存储形式

2.1 正数

正数存储是正常的原码形式,也就是num%2的mod结果,0或1,例如数值3的int存储是:

00000000 00000000 00000000 00000011

用手指查一下,是01,10,11,就查到了3。

2.2 负数

负数存储是补码的形式,比如-3,二进制可就不是11存储在int32了,这可要重点注意。

首先原码转反码,就是0变1,1变0:

原码:00000000 00000000 00000000 00000011
反码:11111111 11111111 11111111 11111100

然后再转为补码,就是在反码的基础上加1:

反码:11111111 11111111 11111111 11111100
补码:11111111 11111111 11111111 11111101

所以-3在int32中的byte存储结果是最终的补码 11111111 11111111 11111111 11111101,再刷题的时候,就不要误以为十进制负数是原码了哦,负数是补码存储的。

2.3 为什么计算机要用补码

留下个问题,大家可以思考下,我将在另一篇文章中介绍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值