本文基于一定的前提,譬如:您已经知道了计算机是01二进制世界,无符号数主要用于逻辑运算,而有符号数用于算术运算。
有符号数有:原码,补码,反码,移码等表示。
原码便于人类阅读和计算,但是不利于计算机进行运算,因此有了补码。
那么补码为什么便于运算呢?
首先我们要明白,原码的计算不便主要是在异号的时候,同号其实是很方便的。如 1001 0001 + 1100 0101 = 1101 0110 (符号位不参与计算,其余位直接相加即可。若有到符号位的进位就是溢出了,这又是另外一个问题)。不方便的地方是异号计算,也就是两个正数相减是很难的。它的步骤如下:
如 17 - 69 = 0001 0001 + 1100 0101 = 1011 0100 = -52
显然,在原码中,减法运算足足比加法运算多了两个步骤,都是为了符号做判断的,这太浪费了。
如果以原码加法作为最基础的运算,我们可以尝试解决这个问题——为正负号判断而多做的两步能否在相加的时候一起解决?
答案当然是肯定的,这就是补码应运而生的原因。我们来看看补码的规则:
既然我们希望补码无论是加法还是减法,都能够直接相加得出结果,那么补码的加法其实和原码加法是一样的。因此正数的时候与源码保持一致就可以解决了。
而减法就是正数A+负数B,在原码中需要比对|A|,|B|大小并将绝对值大的符号位设为结果的符号位。而反码中就是一步到位,那么
设A为正,B为负。b分别为B的补码。
由于A高 ≤ 2^n - 1 ,B高 >= 0,因此A高 - B高 ≤ 2^n - 1。也就是说,
1.A高 < B高 => A高 + x= B高,
2.A高 = B高,
3.A高 > B高 => A高 = B高 + x。
1 ≤ x ≤ 2^n - 1
1.则当A高 > B高 => A高 = B高 + x 的时候,A高 + b高 = A高 + 2^n - 1 - B高 = 2^n + x - 1 ∈ [2^n,2*(2^n - 1)],余数为2^n则符号位需要进一位,从1变为0,2*(2^n - 1) < 2*2^n ,因此只够进一位,不足以进位到符号位之前去。因此在补码运算中,若正数的绝对值大于负数的绝对值,相加后结果也为正。
如A = 69 = 0100 0101,B = 17 = 0001 0001,-B = 1001 0001,[-B]补 = 1110 1111。
A高 = 01 0001 = B高 + x = 00 0100 + 00 1101,A补高 + [-B]补高 = A高 + [-B]补高 = A高 + [-B]高反 = 01 0001 + 11 1011 = 00 1100。结果C的高位C高已经变成正号。
原文:https://www.cnblogs.com/RambleIvy/p/11246796.html