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 为什么计算机要用补码
留下个问题,大家可以思考下,我将在另一篇文章中介绍。