原码、补码、反码的表示及计算

一个数在计算机中的二进制表示形式我们称之为 机器数 或者 机器码 ,机器数是带符号的,在计算机用一个数的最高位存放符号,例如我们下面要讲到的补码、反码。

因为机器数有可能带有符号位,所以我们通常使用 真值 来表示一个机器数所代表的真正值。例如, +4-5 这样的数就是真值的十进制表示。

原码

原码就是在真值的基础上,在真值前面添加一位符号位,非符号位为该数绝对值的二进制表示。一般情况下,对于 正数 的真值,符号位为 0 ;对于 负数 的真值,符号位为 1

例如:

真值 x=+1010x = +1010[x]=01010[x]{原} = 01010

真值 y=1010y = -1010[y]=11010[y]{原} = 11010

特别的,对于数字 0 来说,原码有两种表示方式:

[+0]=0  0000[+0]{原} = 0 \; 000 \cdots 0

[0]=1  0000[-0]{原} = 1 \; 000 \cdots 0

下面给出原码表示的定义:

[x]={x,2n>x02nx=2n+x,0x>2n[x]_{原} = \left\{ \begin{aligned} x , 2^{n} \gt x \geqslant 0 \\ 2^{n} - x = 2^{n} + |x| , 0 \geqslant x \gt -2^{n} \end{aligned} \right.

对于一个除了符号位之外有 n 位的二进制数,原码的表示范围为 (2n1)-(2^{n} - 1)+(2n1)+(2^{n} - 1)

反码

对于 正数 来说,反码与原码一致;对于 负数 来说,反码是最高位即符号位不变,再对其余位按位取反。

例如:

真值 x=+1010x = +1010[x]=01010[x]{原} = 01010[x]=01010[x]{反} = 01010

真值 y=1010y = -1010[y]=11010[y]{原} = 11010[y]=10101[y]{反} = 10101

对于一个除了符号位之外有 n 位的二进制数,反码的表示范围为 (2n1)-(2^{n} - 1)+(2n1)+(2^{n} - 1)

补码

对于 正数 来说,补码与原码一致;对于 负数 来说,补码是该数的反码再加上 1

例如:

真值 x=+1010x = +1010[x]=01010[x]{原} = 01010[x]=01010[x]{反} = 01010[x]=01010[x]{补} = 01010

真值 y=1010y = -1010[y]=11010[y]{原} = 11010[y]=10101[y]{反} = 10101[y]=10110[y]{补} = 10110

下面给出补码表示的定义:

[x]={x,2n>x02n+1+x=2n+1x,0x2n[x]_{补} = \left\{ \begin{aligned} x , 2^{n} \gt x \geqslant 0 \\ 2^{n+1} + x = 2^{n+1} - |x| , 0 \geqslant x \geqslant -2^{n} \end{aligned} \right.

对于一个除了符号位之外有 n 位的二进制数,补码的表示范围为 2n-2^{n}+(2n1)+(2^{n} - 1)

求补码、反码、移码口诀

解释:

  • 原码、补码、反码,该数为正数的情况下,它们三者相同。

  • 该数为负数的情况下,符号位不改变,其余位取反,就得到了反码。将该反码加一得到的就是该数的补码。

  • 不管正数负数,将其补码的符号位取反,其余位不变,得到的就是该数的移码。

下面是一些求补码、反码、移码的例子。

真值 (十进制表示)

真值 (二进制表示)

对应的原码

对应的反码

对应的补码

对应的移码

-1

- 0000 0001

1000 0001

1111 1110

1111 1111

0111 1111

0

0000 0000

1000 0000 0000 0000

1111 1111 0000 0000

0000 0000

1000 0000

1

+ 0000 0001

0000 0001

0000 0001

0000 0001

1000 0001

Last updated

Was this helpful?