为什么负数要用补码表示?
我们以int类型的数字作为例子,int类型是32位的,其中最高位是作为「符号标志位」,正数的符号位是0,负数的符号位是1,剩余的31位则表示二进制数据。而负数就比较特殊了点,负数在计算机中是以「补码」表示的的,所谓的补码就是把正数的二进制全部取反再加1,比如-1的二进制是把数字1的二进制取反后再加1。不知道你有没有想过,为什么计算机要用补码的方式来表示负数?在回答这个问题前,我们假设不用补码的方式来表示负数,而只是把最高位的符号标志位变为1表示负数,如下图过程:如果采用这种方式来表示负数的二进制的话,试想一下-21的运算过程,如下图:按道理,-21-1,但是上面的运算过程中得到结果却是-3,所可以发现,这种负数的表示方式是不能用常规的加法来计算了,就需要特殊处理,要先判断数字是否为负数,如果是负数就要把加法操作变成减法操作才可以得到正确的结果。接下来我们看看补码的计算过程如下图所以如果负数不是使用补码的方式表示,则在做基本的加减法运算的时候,还需要多一步操作来判断是否为负数,如果为负数,还得把加法反转成减法,或者把减法反转成加法,这就非常不好了,毕竟加减法运算在计算机里是很常使的,为了性能考虑,应该要尽量简化比这个运算过程。而用了补码的表示方式,对于负数的加减法操作,实际上是和加正数加减法操作一样的。参考https://www.xiaolincoding.com/os/1_hardware/float.html#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%B4%9F%E6%95%B0%E8%A6%81%E7%94%A8%E8%A1%A5%E7%A0%81%E8%A1%A8%E7%A4%BA