补码是怎么来的?

首先,8位二进制可以表示2^8 = 256个数,很自然可以把它们对应到0到255

但是负数如何表示呢?

很容易想到,如果第一位是0,就是正数,第一位是1就是负数

于是0000 0000B到0111 1111B就是正数,对应0到127

剩下的1000 0000B到1111 1111B就用来表示负数

正数的对应关系是直接参考了最开始的对应关系,那么负数如何对应呢?

为了计算机设计简洁,计算机中只有加法器,对于a-b则变化为a+(-b)

我们希望b+(-b) = 0是满足的,所以-b = 0 - b,也即是对于8位二进制我们选择模为1 0000 0000B(不明白可以参考这里)

那么-127的二进制就是 1 0000 0000B - 0111 1111B = 1000 0001B

于是从1000 0001B到1111 1111B与-127到-1相对应

最后剩下1000 0000B没有指定它代表的数

可以想到的几个比较合理的备选数是0,128,-128

因为0000 0000B表示0,没有必要1000 0000B也来表示0

因为1000 0000B开头是1,按照之前的规则应当是个负数,所以128不合适

1000 0000B = 1100 0000B+1100 0000B = -64-64 = -128

原文地址:https://www.cnblogs.com/N3ptuner/p/12625761.html