关于二进制:二进制反码补码

30次阅读

共计 3317 个字符,预计需要花费 9 分钟才能阅读完成。

二进制、反码、补码

前置浏览:

  • C 语言中文网 - 汇编语言基本概念简介 - 补码及进制转换

根底概念

有符号二进制整数有负数和正数。在 x86 处理器中,MSB 示意的是符号位:0 示意负数,1 示意正数。下图展现了 8 位的负数和正数:

  • 负整数用补码(two\`s-complement)示意时,应用的数学原理是:一个整数的补码是其加法逆元。(如果将一个数与其加法逆元相加,后果为 0。)
  • 补码表示法对处理器设计者来说很有用,因为有了它就不须要用两套独立的电路来解决加法和减法。

    • 例如,如果表达式为 A-B,则处理器就能够很不便地将其转换为加法表达式:A+(-B)。
  • 将一个二进制整数按位取反(求补)再加 1,就造成了它的补码,过程如下所示:1111 1111 是 -1 的补码。
初始值 00000001
第一步:按位取反 11111110
第二步:将上一步失去的后果加 111111110 +
00000001
和值:补码示意 11111111

概念总结:

  • 反码、补码是二进制的一种表现形式;
  • 在计算机内所有数值底层都用补码示意,无论正负数(十进制);
  • 如果一串二进制值须要视为数值则须要将其视为补码;
  • 反码是十进制转二进制计算的一个过程即对一个十进制取补码的过程,个别用在正数转换规则上;
  • 反码能够通过二进制值按位取反失去(所有二进制位都取反);
  • 负数(十进制)的补码是其二进制自身,正数(十进制)的补码是十进制正数的绝对值求补码后取反码加一;
  • 示意负数的补码能够间接转成十进制,示意正数的补码想要转回十进制步骤如下:

    • 对示意正数的补码取反码加一失去正数的十进制绝对值补码;
    • 再将正数的十进制绝对值补码转成十进制失去正数的十进制绝对值;
    • 最初加上符号位;
  • 无论是负数加负数(十进制加法)还是负数 / 正数加正数(十进制减法)都能够用补码加补码示意;

反码

反码能够通过二进制值按位取反失去(所有二进制位都取反)

负数的反码示例:

十进制数值 补码 反码
00000 00001111 1111
10000 00011111 1110
20000 00101111 1101
30000 00111111 1100
40000 01001111 1011

正数的反码示例:

十进制数值 补码 反码
-00000 00001111 1111
-11111 11110000 0000
-21111 11100000 0001
-31111 11010000 0010

补码(十进制转二进制)

在计算机内所有数值底层都用补码示意,无论正负数(十进制)

十进制数值 补码
00000 0000
10000 0001
20000 0010
30000 0011
-00000 0000
-11111 1111
-21111 1110
-31111 1101

正数补码计算过程示例:

十进制数值 绝对值 绝对值补码 绝对值补码取反 绝对值补码取反加一 正确补码 十进制数值
-000000 00001111 11111111 1111
+ 1
—————
1,0000 0000
0000 0000-0
-110000 00011111 11101111 1110
+ 1
—————
1111 1111
1111 1111-1
-220000 00101111 11011111 1101
+ 1
—————
1111 1110
1111 1110-2
-330000 00111111 11001111 1100
+ 1
—————
1111 1101
1111 1101-3
-440000 01001111 10111111 1011
+ 1
—————
1111 1100
1111 1100-4
-550000 01011111 10101111 1010
+ 1
—————
1111 1011
1111 1011-5

补码(二进制转十进制)

示意负数的补码能够间接转成十进制,示意正数的补码想要转回十进制步骤如下:

  • 对示意正数的补码取反码加一失去正数的十进制绝对值补码;
  • 再将正数的十进制绝对值补码转成十进制失去正数的十进制绝对值;
  • 最初加上符号位;
MSB 补码 十进制数值
00000 00000
00000 00011
00000 00102
00000 00113
00000 01004
00000 01015
11111 1111-1
11111 1110-2
11111 1101-3
11111 1100-4
11111 1011-5

正数转换示例:

MSB 补码 补码取反 补码取反加一 补码取反加一后所代表十进制值 符号 十进制后果 补码
11111 11110000 00000000 00011-11111 1111
11111 11100000 00010000 00102-21111 1110
11111 11010000 00100000 00113-31111 1101
11111 11000000 00110000 01004-41111 1100
11111 10110000 01000000 01015-51111 1011

补码相加

无论是负数加负数(十进制加法)还是负数 / 正数加正数(十进制减法)都能够用补码加补码示意

负数加负数的补码计算过程示例:

表达式 补码相加 二进制后果 十进制后果
0+00000 0000
+ 0000 0000
——————
0000 0000
0000 00000
0+10000 0000
+ 0000 0001
——————
0000 0001
0000 00011
1+10000 0001
+ 0000 0001
——————
0000 0010
0000 00102
2+10000 0010
+ 0000 0001
——————
0000 0011
0000 00113

负数加正数的补码计算过程示例:

表达式 补码相加 二进制后果 十进制后果
0+(-0)0000 0000
+ 0000 0000
——————
0000 0000
0000 00000
0+(-1)0000 0000
+ 1111 1111
——————
1111 1111
1111 1111-1
1+(-1)0000 0001
+ 1111 1111
——————
1,0000 0000
0000 00000
1+(-2)0000 0001
+ 1111 1110
——————
1111 1111
1111 1111-1
2+(-2)0000 0010
+ 1111 1110
——————
1,0000 0000
0000 00000
2+(-1)0000 0010
+ 1111 1111
——————
1,0000 0001
0000 00011

正数加正数的补码计算过程示例:

表达式 补码相加 二进制后果 十进制后果
(-0)+(-0)0000 0000
+ 0000 0000
——————
0000 0000
0000 00000
(-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
00000 00001111 1111-1
10000 00011111 1110-2
20000 00101111 1101-3
30000 00111111 1100-4
40000 01001111 1011-5

正数示例:

十进制数值 x 取补码 fn1(x)=a 取反码 fn2(x)=b 计算反码后果代表的十进制数值 y
-00000 00001111 1111-1
-11111 11110000 00000
-21111 11100000 00011
-31111 11010000 00102

示例汇总:

十进制数值 x 取补码 fn1(x)=a 取反码 fn2(x)=b 计算反码后果代表的十进制数值 y
00000 00001111 1111-1
10000 00011111 1110-2
20000 00101111 1101-3
30000 00111111 1100-4
-00000 00001111 1111-1
-11111 11110000 00000
-21111 11100000 00011
-31111 11010000 00102

能够得出反码所示意的数值与原数值之间法则如下:

  • fn2(x) = -x-1 = -(x+1)
  • y = -(x+1)

参考

  • C 语言中文网 - 汇编语言基本概念简介 - 补码及进制转换
正文完
 0