最小负数的补码 -- 解疑

时间久了,经常会在一些很细微,但是却又很重要的地方犯糊涂。
比如这两天我就遇到一个问题,以 32 位的有符号整数 int 为例,最小负数的补码是 0x8000 0000,他对应的十进制数是 - 2147483648。那么问题来了,这个补码对应的原码是怎么变化来的?

根据我们以前的经验,先减1,然后再非符号位取反,最后得到的原码好像也不对啊?

我们参考最大正数 + 2147483647 的原码,是 0x7FFF FFFF ,那么其对应的相反数 - 2147483647 的原码是0x FFFF FFFF 。再转换成补码是 0x 8000 0001

所以,最后,我在网上找到的“某种”说法是,最小负数补码的由来,就是当前最大正数相反数的补码 减 1 得到的。因为人们发现,这样减 1 ,符号位正好不变化,因此也不会溢出,所以干脆就扩了一位。但是这个最小负数,是没有对应的原码的。

行吧,就这么记吧。

你可能感兴趣的:(最小负数的补码 -- 解疑)