1

二进制、反码、补码

前置阅读:

基础概念

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

概念总结:

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

    • 对表示负数的补码取反码加一得到负数的十进制绝对值补码;
    • 再将负数的十进制绝对值补码转成十进制得到负数的十进制绝对值;
    • 最后加上符号位;
  • 无论是正数加正数(十进制加法)还是正数/负数加负数(十进制减法)都可以用补码加补码表示;
  • 一个值的正数的补码与其负数的补码相加等于 0;

反码

反码可以通过二进制值按位取反得到(所有二进制位都取反)

正数的反码示例:

十进制数值补码反码
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

通过该表格示例可以得出以下两个规律:

规律 1

反码所表示的数值与原数值之间规律如下(y 代表反码之后的十进制值):

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

即如果想得到一个十进制正数值的负数形式(1 => -1)或则得到一个十进制负数值的正数形式可以通过对原值取反码加一得到:

十进制数值 x十进制取反 -x过程
00取反码(0)+1 = -1+1
1-1取反码(1)+1 = -2+1
2-2取反码(2)+1 = -3+1
3-3取反码(3)+1 = -4+1
-11取反码(-1)+1 = 0+1
-22取反码(-2)+1 = 1+1
-33取反码(-3)+1 = 2+1

规律 2

将示例汇总表格再进一步简化:

十进制数值 xx 的反码十进制表示形式 y翻译 -1翻译 -2
0-10 的反码是 -1-1 是 0 的反码
1-21 的反码是 -2-2 是 1 的反码
2-32 的反码是 -3-3 是 2 的反码
3-43 的反码是 -4-4 是 3 的反码
-0-1-0 的反码是 -1-1 是 -0 的反码
-10-1 的反码是 00 是 -1 的反码
-21-2 的反码是 11 是 -2 的反码
-32-3 的反码是 22 是 -3 的反码

可以看出在十进制格式下,原数值与反码的关系:

  • 如果我需要 -1 我可以用 0 的反码代替;
  • 如果我需要 -4 我可以用 3 的反码代替;
  • 规律:

    • x = |y| -1
    • x + y = -1

参考


Tomson
2.3k 声望101 粉丝

引用和评论

0 条评论