用补码取反加一求原码的陷阱

问题引入 :一个8位补码:1000 0000 请求它的原码?
【用补码取反加一求原码的陷阱】如果按照以往的取反加一经验:取反得到 1111 1111B ,再加1得到 0000 0000B ?结果是0?
这明显不对,因为我们知道不管是正0还是负0,其补码都应该是 0000 0000B而不是题中的1000 0000B。
探究: 让我们来思考一个问题:一个8位有符号二进制数,除掉符号位其表示范围为 0~128,如果加上符号位,照理说应该乘2,也就是256个码字可以用来表示,但是我们知道8位有符号数的表示范围是-127-127,也就是说一共255个数,可以发现少了一个数,这是因为负数0没有意义。我们可以猜想到:原码有255个,如果通过取反加一得到的补码也就会少一个,而这个数就是1000 0000,其无法通过取反加一得到(因为如果只有0无法借位)。所以为什么会有补码的存在,就是用来弥补原码负0的不足。
结论归纳: 原码求补码:正数不变,对于负数我们仍然可以取反加一
补码求原码:对于1开头后全0的数,其真值就是负0浪费的值,也就是-128(0到127,所以-1应该到128),这个补码是没法通过取反加一求原码的,因为其没有原码。但对于其他补码我们仍然可以取反加1求原码。

    推荐阅读