Skip to content

真值与机器数

考情分析

原码/反码/补码/移码是整个数据表示章节的基础。选择题几乎每年必考:给定机器码求真值,或给定真值求各种机器码,尤其是边界值(最大/最小值)和 0 的特殊表示。

真值与机器数

真值:带正负号的实际数值,如 +10110.1101

机器数:在计算机中用 0/1 编码表示的数,符号位也被编码进去。

机器数的四种表示方式:原码、反码、补码、移码。

原码

符号位:正数为 0,负数为 1;数值位保持真值的绝对值不变。

[X]={X0X<2n2n+|X|2n<X0

其中 n 为数值位位数(不含符号位)。2n+|X| 的含义是符号位置 1,数值位保持绝对值不变。

(8 位):

真值原码
+000000000
010000000
+12701111111
12711111111
110000001

原码的 0 有两种表示(+00),这是个麻烦。

表示范围n 位原码,含 1 位符号位):(2n11)+(2n11)

反码

正数的反码与原码相同;负数的反码是原码数值位按位取反

(8 位):

真值原码反码
+00000000000000000
01000000011111111
+1270111111101111111
1271111111110000000
11000000111111110

反码的 0 同样有两种表示。反码现在很少单独使用,主要作为求补码的中间步骤。

补码

正数的补码与原码相同;负数的补码是反码加 1(等价于:原码数值位取反后末位加 1)。

[X]={X0X<2n2n+1+X2nX<0

(8 位):

真值原码补码
+00000000000000000
01000000000000000
+1270111111101111111
128无法表示10000000
11000000111111111
1271111111110000001

补码中 0 的表示唯一,且比原码多表示一个最小负数 2n1

表示范围n 位补码):2n1+(2n11)

补码 → 真值(求原码)

  • 符号位为 0:真值 = 补码本身
  • 符号位为 1:数值位取反加 1,得到原码数值位,符号为负

:补码 10110101

数值位 0110101 取反 → 1001010,加 1 → 1001011

真值 = 10010112=75

快速记忆

  • 1 的补码:全 1(11111111
  • 128 的补码(8位):10000000
  • 2n1 是补码能表示的最小负数,无对应原码

移码

移码主要用于表示浮点数的阶码(指数部分)。

[X]=2n+X(2nX<2n)

即在真值的基础上加上偏置量 2nn 为数值位位数)。移码与补码的关系:移码 = 补码的符号位取反

(8位移码,偏置量 27=128):

真值补码移码
+00000000010000000
00000000010000000
+1270111111111111111
1281000000000000000
11111111101111111

移码中真值 0 的表示唯一,且便于比较大小(移码的数值大小与真值大小顺序一致)。

移码与 IEEE 754

IEEE 754 浮点数的阶码使用的是偏置码,偏置量不是 2n1 而是 2n11(单精度 127,双精度 1023),与纯移码稍有区别。

四种编码对比

编码正数负数0 的唯一性表示范围(n 位)
原码符号位 0 + 绝对值符号位 1 + 绝对值否(+0/-0)[(2n11),2n11]
反码同原码数值位取反[(2n11),2n11]
补码同原码反码+1[2n1,2n11]
移码补码符号位取反[2n1,2n11]

典型例题

例题 1:设机器字长 8 位(含 1 位符号位),写出真值 45 的原码、反码、补码。

45=32+8+4+1=(101101)2,8 位表示为 00101101

  • 原码:10101101
  • 反码:11010010(数值位取反)
  • 补码:11010011(反码加 1)

例题 2:已知某补码为 11001100,求其真值。

符号位为 1,数值位取反加 1:0110011 + 1 = 0110100 = 52

真值 = 52

例题 3:8 位补码所能表示的最小负数是多少?

27=128,对应补码 10000000

考点清单

  • [ ] 原码、反码、补码、移码的定义和转换规则
  • [ ] 正负零的各种编码表示,补码中 0 唯一
  • [ ] 补码比原码多表示一个最小负数 2n1
  • [ ] n 位补码的表示范围:[2n1,2n11]
  • [ ] 已知补码求真值的方法(数值位取反加 1)
  • [ ] 移码 = 补码符号位取反,主要用于阶码