共计 3317 个字符,预计需要花费 9 分钟才能阅读完成。
二进制、反码、补码
前置浏览:
- C 语言中文网 - 汇编语言基本概念简介 - 补码及进制转换
根底概念
有符号二进制整数有负数和正数。在 x86 处理器中,MSB 示意的是符号位:0 示意负数,1 示意正数。下图展现了 8 位的负数和正数:
- 负整数用补码(two\`s-complement)示意时,应用的数学原理是:一个整数的补码是其加法逆元。(如果将一个数与其加法逆元相加,后果为 0。)
补码表示法对处理器设计者来说很有用,因为有了它就不须要用两套独立的电路来解决加法和减法。
- 例如,如果表达式为 A-B,则处理器就能够很不便地将其转换为加法表达式:A+(-B)。
- 将一个二进制整数按位取反(求补)再加 1,就造成了它的补码,过程如下所示:1111 1111 是 -1 的补码。
初始值 | 00000001 |
---|---|
第一步:按位取反 | 11111110 |
第二步:将上一步失去的后果加 1 | 11111110 + 00000001 |
和值:补码示意 | 11111111 |
概念总结:
- 反码、补码是二进制的一种表现形式;
- 在计算机内所有数值底层都用补码示意,无论正负数(十进制);
- 如果一串二进制值须要视为数值则须要将其视为补码;
- 反码是十进制转二进制计算的一个过程即对一个十进制取补码的过程,个别用在正数转换规则上;
- 反码能够通过二进制值按位取反失去(所有二进制位都取反);
- 负数(十进制)的补码是其二进制自身,正数(十进制)的补码是十进制正数的绝对值求补码后取反码加一;
示意负数的补码能够间接转成十进制,示意正数的补码想要转回十进制步骤如下:
- 对示意正数的补码取反码加一失去正数的十进制绝对值补码;
- 再将正数的十进制绝对值补码转成十进制失去正数的十进制绝对值;
- 最初加上符号位;
- 无论是负数加负数(十进制加法)还是负数 / 正数加正数(十进制减法)都能够用补码加补码示意;
反码
反码能够通过二进制值按位取反失去(所有二进制位都取反)
负数的反码示例:
十进制数值 | 补码 | 反码 |
---|---|---|
0 | 0000 0000 | 1111 1111 |
1 | 0000 0001 | 1111 1110 |
2 | 0000 0010 | 1111 1101 |
3 | 0000 0011 | 1111 1100 |
4 | 0000 0100 | 1111 1011 |
正数的反码示例:
十进制数值 | 补码 | 反码 |
---|---|---|
-0 | 0000 0000 | 1111 1111 |
-1 | 1111 1111 | 0000 0000 |
-2 | 1111 1110 | 0000 0001 |
-3 | 1111 1101 | 0000 0010 |
补码(十进制转二进制)
在计算机内所有数值底层都用补码示意,无论正负数(十进制)
十进制数值 | 补码 |
---|---|
0 | 0000 0000 |
1 | 0000 0001 |
2 | 0000 0010 |
3 | 0000 0011 |
-0 | 0000 0000 |
-1 | 1111 1111 |
-2 | 1111 1110 |
-3 | 1111 1101 |
正数补码计算过程示例:
十进制数值 | 绝对值 | 绝对值补码 | 绝对值补码取反 | 绝对值补码取反加一 | 正确补码 | 十进制数值 |
---|---|---|---|---|---|---|
-0 | 0 | 0000 0000 | 1111 1111 | 1111 1111 + 1 ————— 1,0000 0000 | 0000 0000 | -0 |
-1 | 1 | 0000 0001 | 1111 1110 | 1111 1110 + 1 ————— 1111 1111 | 1111 1111 | -1 |
-2 | 2 | 0000 0010 | 1111 1101 | 1111 1101 + 1 ————— 1111 1110 | 1111 1110 | -2 |
-3 | 3 | 0000 0011 | 1111 1100 | 1111 1100 + 1 ————— 1111 1101 | 1111 1101 | -3 |
-4 | 4 | 0000 0100 | 1111 1011 | 1111 1011 + 1 ————— 1111 1100 | 1111 1100 | -4 |
-5 | 5 | 0000 0101 | 1111 1010 | 1111 1010 + 1 ————— 1111 1011 | 1111 1011 | -5 |
补码(二进制转十进制)
示意负数的补码能够间接转成十进制,示意正数的补码想要转回十进制步骤如下:
- 对示意正数的补码取反码加一失去正数的十进制绝对值补码;
- 再将正数的十进制绝对值补码转成十进制失去正数的十进制绝对值;
- 最初加上符号位;
MSB | 补码 | 十进制数值 |
---|---|---|
0 | 0000 0000 | 0 |
0 | 0000 0001 | 1 |
0 | 0000 0010 | 2 |
0 | 0000 0011 | 3 |
0 | 0000 0100 | 4 |
0 | 0000 0101 | 5 |
1 | 1111 1111 | -1 |
1 | 1111 1110 | -2 |
1 | 1111 1101 | -3 |
1 | 1111 1100 | -4 |
1 | 1111 1011 | -5 |
正数转换示例:
MSB | 补码 | 补码取反 | 补码取反加一 | 补码取反加一后所代表十进制值 | 符号 | 十进制后果 | 补码 |
---|---|---|---|---|---|---|---|
1 | 1111 1111 | 0000 0000 | 0000 0001 | 1 | – | -1 | 1111 1111 |
1 | 1111 1110 | 0000 0001 | 0000 0010 | 2 | – | -2 | 1111 1110 |
1 | 1111 1101 | 0000 0010 | 0000 0011 | 3 | – | -3 | 1111 1101 |
1 | 1111 1100 | 0000 0011 | 0000 0100 | 4 | – | -4 | 1111 1100 |
1 | 1111 1011 | 0000 0100 | 0000 0101 | 5 | – | -5 | 1111 1011 |
补码相加
无论是负数加负数(十进制加法)还是负数 / 正数加正数(十进制减法)都能够用补码加补码示意
负数加负数的补码计算过程示例:
表达式 | 补码相加 | 二进制后果 | 十进制后果 |
---|---|---|---|
0+0 | 0000 0000 + 0000 0000 —————— 0000 0000 | 0000 0000 | 0 |
0+1 | 0000 0000 + 0000 0001 —————— 0000 0001 | 0000 0001 | 1 |
1+1 | 0000 0001 + 0000 0001 —————— 0000 0010 | 0000 0010 | 2 |
2+1 | 0000 0010 + 0000 0001 —————— 0000 0011 | 0000 0011 | 3 |
负数加正数的补码计算过程示例:
表达式 | 补码相加 | 二进制后果 | 十进制后果 |
---|---|---|---|
0+(-0) | 0000 0000 + 0000 0000 —————— 0000 0000 | 0000 0000 | 0 |
0+(-1) | 0000 0000 + 1111 1111 —————— 1111 1111 | 1111 1111 | -1 |
1+(-1) | 0000 0001 + 1111 1111 —————— 1,0000 0000 | 0000 0000 | 0 |
1+(-2) | 0000 0001 + 1111 1110 —————— 1111 1111 | 1111 1111 | -1 |
2+(-2) | 0000 0010 + 1111 1110 —————— 1,0000 0000 | 0000 0000 | 0 |
2+(-1) | 0000 0010 + 1111 1111 —————— 1,0000 0001 | 0000 0001 | 1 |
正数加正数的补码计算过程示例:
表达式 | 补码相加 | 二进制后果 | 十进制后果 |
---|---|---|---|
(-0)+(-0) | 0000 0000 + 0000 0000 —————— 0000 0000 | 0000 0000 | 0 |
(-1)+(-1) | 1111 1111 + 1111 1111 —————— 1,1111 1110 | 1111 1110 | -2 |
(-1)+(-2) | 1111 1111 + 1111 1110 —————— 1,1111,1101 | 1111 1101 | -3 |
二进制、反码、补码
同样的一串二进制数字,即能够是反码也能够是补码,如果是补码则其能够通过上述规定转成对应的十进制数值,如果是反码则代表其为计算过程两头值,如果想晓得反码在十进制中所示意的数值,能够将其视为补码再通过上述规定转成十进制即可。
负数示例:
十进制数值 x | 取补码 fn1(x)=a | 取反码 fn2(x)=b | 计算反码后果代表的十进制数值 y |
---|---|---|---|
0 | 0000 0000 | 1111 1111 | -1 |
1 | 0000 0001 | 1111 1110 | -2 |
2 | 0000 0010 | 1111 1101 | -3 |
3 | 0000 0011 | 1111 1100 | -4 |
4 | 0000 0100 | 1111 1011 | -5 |
正数示例:
十进制数值 x | 取补码 fn1(x)=a | 取反码 fn2(x)=b | 计算反码后果代表的十进制数值 y |
---|---|---|---|
-0 | 0000 0000 | 1111 1111 | -1 |
-1 | 1111 1111 | 0000 0000 | 0 |
-2 | 1111 1110 | 0000 0001 | 1 |
-3 | 1111 1101 | 0000 0010 | 2 |
示例汇总:
十进制数值 x | 取补码 fn1(x)=a | 取反码 fn2(x)=b | 计算反码后果代表的十进制数值 y |
---|---|---|---|
0 | 0000 0000 | 1111 1111 | -1 |
1 | 0000 0001 | 1111 1110 | -2 |
2 | 0000 0010 | 1111 1101 | -3 |
3 | 0000 0011 | 1111 1100 | -4 |
-0 | 0000 0000 | 1111 1111 | -1 |
-1 | 1111 1111 | 0000 0000 | 0 |
-2 | 1111 1110 | 0000 0001 | 1 |
-3 | 1111 1101 | 0000 0010 | 2 |
能够得出反码所示意的数值与原数值之间法则如下:
- fn2(x) = -x-1 = -(x+1)
- y = -(x+1)
参考
- C 语言中文网 - 汇编语言基本概念简介 - 补码及进制转换
正文完