补码运算的本质

补码运算的本质数学原理就是取模求余
设二进位表示的位数共有 n n n位,那么实际上所有的运算结果都对 2 n 2^n 2n求余
比如说有两个数 a a a b b b,他们相加的结果实际上就是 ( a + b ) m o d    2 n (a+b)\mod 2^n (a+b)mod2n
但是直接这么相加的前提是他们都是正数,而负数是有符号位的,不能就直接这么参与运算
所以还是假设 a a a b b b都是正数(均小于 2 n 2^n 2n,如果比 2 n 2^n 2n就要先取模求余),那么相减怎么统一为相加呢,很简单:
( a − b ) m o d    2 n = a m o d    2 n − b m o d    2 n = a m o d    2 n + ( − b ) m o d    2 n = a m o d    ( 2 n ) + ( 2 n − b ) m o d    2 n (a-b)\mod 2^n=a\mod 2^n-b\mod 2^n=a\mod 2^n+(-b)\mod 2^n=a\mod(2^n)+(2^n-b)\mod 2^n (ab)mod2n=amod2nbmod2n=amod2n+(b)mod2n=amod(2n)+(2nb)mod2n
这里 a a a是正数, 2 n − b 2^n-b 2nb也是正数
试想反码和补码的定义,如果一个数加上它的反码那么就是一个二进位全是1的数也就是 2 n − 1 2^n-1 2n1,对于负数来说补码是反码+1,那么如果一个负数加上它的补码实际上就等于 2 n 2^n 2n
所以负数的补码设计的精妙之处如下:
如果有一个负数 x x x,它之所以是负数就是因为符号位是 1 1 1,那么现在将它的符号位看成普通二进制位,也就是说将这个负数的原码形式看成是一个无符号数,那么也就是说可以看成是一个正数 x ′ x' x进行正常运算,那么这个负数 x x x(正数形式下的 x ′ x' x)的补码就是 2 n − x ′ 2^n-x' 2nx,由于 x ′ m o d    2 n = ( 2 n − x ′ ) m o d    2 n x'\mod 2^n=(2^n-x')\mod 2^n xmod2n=(2nx)mod2n,所以 x ′ x' x(二进制下和负数 x x x的表示是一样的)和 2 n − x ′ 2^n-x' 2nx(二进制下和负数 x x x的补码表示是一样的)在对 2 n 2^n 2n取模的意义上是同一个数,可以这么理解,这两个数的区别在于一个进行顺时针旋转,一个进行逆时针旋转(这里旋转指的是是对 2 n 2^n 2n取模后的数实际上是构成一个域的,比如127再顺时针转一下就是-128了)所以这里采用补码还是原码实际上是挑选了一个旋转方向
另附一篇还不错的blog探究计算机中补码运算的本质

你可能感兴趣的:(补码)