在计算机中,所有数字都用0/1二进制表示,编码一般分为“原码、反码、补码”三种。
正数
正数的原码、反码、补码都一样,对于纯小数也一样。
比如 \(5 = (101)_{2}\)
- 原码:\((101)_{2}\)
- 反码:\((101)_{2}\)
- 补码:\((101)_{2}\)
比如 \(0.25 = (0010)_{2}\)
- 原码:\((0010)_{2}\)
- 反码:\((0010)_{2}\)
- 补码:\((0010)_{2}\)
负数
负数在进行反码和补码操作时,都与“符号位无关”,反码是除符号位外所有位取反,补码等于反码+1(进位时到符号位截断,也无需考虑进位到符号位,只有-0会出现这种奇葩现象)。
在计算机中,负数都用补码存储,其实正数也是用补码存储的,但是正数的补码和原码一样。
比如\(-2 = (10000010)_{2}\)
- 原码:\((10000010)_{2}\)
- 反码:\((11111101)_{2}\)
- 补码:\((11111110)_{2}\)
比如\(-0.25 = (1010)_{2}\)
- 原码:\((1010)_{2}\)
- 反码:\((1101)_{2}\)(注意取反码时符号位不动)
- 补码:\((1110)_{2}\)(负数的补码 = 反码 + 1)
加减法运算
\(N1 + N2 = [N1]_{补} + [N2]_{补} = [N1 + N2]_{补}\)
\(N1 - N2 = [N1]_{补} - [N2]_{补} = [N1 - N2]_{补}\)
使用补码计算\(N1 + N2\)时,首先分别求出两者的补码,然后将补码相加(符号位当做普通位数参与运算),得到的结果就是求和结果,符号位是1就是负数,是0就是正数。
使用补码计算\(N1 - N2 = N1 + (-N2)\),可以将减法转换成加法计算。
当计算过程中出现进位溢出时,直接将溢出部分截断,这是计算规则。
比如\(5 - 2 = 5 + (-3)\)的计算过程如下:

关于补码应该知道的
- 计算机中所有的数字(不论正数、负数,还是整数、浮点)都用补码储存。
- 用补码计算免去了对符号的判断,比原码计算更快更方便。
- 正数的反码、补码和原码一样。
- 负数的补码 = 反码 + 1
- 补码的原理是利用数据溢出。
Comments NOTHING