原码与补码

为了方便,本文假设系统为4位系统。

原码

原码即我们熟知的十进制转二进制,不过最高位为符号位,1代表负数。

image-20211210164307372

如2的源码是0010,-2的原码是1010,负数的原码不能直接计算,比如2-2应该为0,但按照源码的二进制计算为1100(-4)。因此计算时需要一种新的表示方法,那就是补码。

补码

4位的二进制,最大的数是1111,再加1后即溢出,10000的最高位会丢失,因此它就是从0000-1111的循环。想象一下,我们加上一个负数可以理解为在刻度线上左移一段,但我们也可以向右移动(加上某个数)得到相同的结果。

image-20211210163802901

还是拿-2举例,往左移动2格和往右移动14格得到的结果是一样的,因此14就是-2的补码,我们需要减一个数时,加上它的补码即可。

可以发现,补码的最高位也可以用于表示符号,并且1000可以用来表示-8,而在原码中1000是0。

补码的计算:

补码的计算也十分方便。我们需要计算一个负数的补码时,也即是计算它的正数向右移动多少发生溢出。

还是以-2为例:

-2的正数是2:0010,按位取反后是1101,两者加起来是:1111;在这基础上再加1,即发生了溢出。

因此一个负数补码的计算是:其正数的原码按位取反加一。

参考:
带你认识CPU第04期——CPU是怎么计算减法的

原文地址:https://www.cnblogs.com/cpcpp/p/15672664.html