首先,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