今天看到《C语言深度解剖》里面讲负数存储用补码,一时就补习一下求补码。
于是看到一篇很好的文章,它把补码用数学方式进行表达。
读完了《编码-隐匿在计算机软硬件背后的语言》(csdn下载),总算知道了计算机为什么使用补码:为了使用加法器做减法。
---------------------------------------------------------------------------------------------------------------------------------------
补码的第一种定义( 数学定义 ):
以8位宽度为例,已知一个数 X,其 8 位字长的补码定义为:
....................| X; 0 <= X <= +127 ;(也就是说:正数和0的补码,就是该数字本身)
X的补码 = |
....................| 2^8 -|X|; -128 <= X < 0 ; (也就是说:8bit负数的补码,就是用 1 0000 0000,减去该数字的绝对值)
当然,补码求反码的定义也是和这里定义的补码的一样。
他举了例子:
例如 X = -126,其补码为 1000 0010,计算方法如下:
1 0000 0000
- 0111 1110
-----------
1000 0010
应用补码进行运算:
用补码计算:83-25=58。
83 ---都变成补码,再用加法运算--> 0101 0011
- 25 -> 1 0000 0000 - 0001 1001-> + 1110 0111
----- --------
58 <--忽略进位1,结果就是正确的--[1] 0011 1010
用这个定义求出-128的补码是0b10000000。