真数是人能理解的数值,机器数是计算机内部按固定规则编码后的 0/1 串;原码、反码、补码、移码都是有符号数的机器数表示方法。
一、先分清:真数、机器数、无符号数、有符号数
真数就是数本身,带有正负号,例如:
+45
-45
+0.1011
-0.1011
机器数是把符号也编码进二进制位之后得到的形式,例如 8 位机器数:
00101101
10101101
11010011
01010011
这些 0/1 串本身没有天然意义,必须看题目说明它是原码、反码、补码还是移码。比如同样是 11010011,若按补码解释是 -45,若按无符号数解释就是 211。
408 题里经常默认:n 位机器数包括符号位。例如 8 位原码中,最高位是符号位,后 7 位是数值位。
二、原码、反码、补码、移码的本质区别
1. 原码:最高位表示符号,其余位表示绝对值
原码最符合人的直觉。
正数:符号位 0,数值位为绝对值
负数:符号位 1,数值位为绝对值
例如 8 位表示 +45 和 -45:
45 = 0101101 // 7 位数值位
[+45]原 = 00101101
[-45]原 = 10101101
原码的优点是直观,缺点是加减运算麻烦,因为符号和数值要分开处理。另外原码有两个 0:
[+0]原 = 00000000
[-0]原 = 10000000
所以 n 位原码整数的表示范围是:
-(2ⁿ⁻¹ - 1) 到 +(2ⁿ⁻¹ - 1)
例如 8 位原码:
-127 到 +127
注意:8 位原码不能表示 -128。
2. 反码:正数同原码,负数在原码基础上数值位取反
反码是原码和补码之间的过渡形式。
正数:反码 = 原码
负数:符号位不变,数值位按位取反
还是以 -45 为例:
[-45]原 = 10101101
[-45]反 = 11010010
过程是:
原码:1 0101101
反码:1 1010010
符号位 1 不变,后面的数值位 0101101 取反为 1010010。
反码也有两个 0:
[+0]反 = 00000000
[-0]反 = 11111111
所以 n 位反码整数范围和原码一样:
-(2ⁿ⁻¹ - 1) 到 +(2ⁿ⁻¹ - 1)
例如 8 位反码:
-127 到 +127
3. 补码:正数同原码,负数等于反码加 1
补码是考研中最重要的表示法,因为计算机中整数加减法主要用补码来做。
正数:补码 = 原码 = 反码
负数:补码 = 反码 + 1
以 -45 为例:
[-45]原 = 10101101
[-45]反 = 11010010
[-45]补 = 11010011
也可以直接记:
负数补码 = 符号位不变,数值位取反加 1
补码只有一个 0:
[+0]补 = 00000000
[-0]补 不存在
所以补码比原码、反码多表示一个最小负数。
n 位补码整数范围是:
-2ⁿ⁻¹ 到 +(2ⁿ⁻¹ - 1)
例如 8 位补码:
-128 到 +127
这里是常考陷阱:
10000000
在 8 位补码中表示 -128,不是 -0。
4. 移码:在真值基础上加一个偏置值
移码也叫偏置码,常用于表示浮点数的阶码。它的核心公式是:
[X]移 = X + 偏置值
对于 n 位移码,常用偏置值是:
2ⁿ⁻¹
所以 n 位移码整数的表示范围通常也是:
-2ⁿ⁻¹ 到 +(2ⁿ⁻¹ - 1)
例如 8 位移码,偏置值是:
2⁷ = 128
如果 X = -45:
[-45]移 = -45 + 128 = 83
83 的 8 位二进制 = 01010011
所以:
[-45]移 = 01010011
如果 X = +45:
[+45]移 = 45 + 128 = 173
173 的 8 位二进制 = 10101101
所以:
[+45]移 = 10101101
移码有一个非常重要的性质:
同位数下,移码 = 补码的符号位取反
例如:
[-45]补 = 11010011
[-45]移 = 01010011
只把最高位从 1 改成 0。
再看正数:
[+45]补 = 00101101
[+45]移 = 10101101
只把最高位从 0 改成 1。
所以补码和移码互转非常快:
补码 ↔ 移码:只取反最高位,其余位不变
但注意,移码最高位不能简单理解为传统符号位。在移码中,最高位为 1 通常表示非负数区间,最高位为 0 通常表示负数区间,这和原码、反码、补码的符号位习惯刚好相反。
三、四种码的对比表
假设 n 位机器数表示定点整数:
| 表示法 | 正数 | 负数 | 0 的个数 | n 位整数范围 | 主要用途 |
|---|---|---|---|---|---|
| 原码 | 符号位 0,数值位为绝对值 | 符号位 1,数值位为绝对值 | 2 个 | -(2ⁿ⁻¹ – 1) 到 +(2ⁿ⁻¹ – 1) | 直观表示 |
| 反码 | 与原码相同 | 原码数值位取反 | 2 个 | -(2ⁿ⁻¹ – 1) 到 +(2ⁿ⁻¹ – 1) | 补码过渡 |
| 补码 | 与原码相同 | 反码加 1 | 1 个 | -2ⁿ⁻¹ 到 +(2ⁿ⁻¹ – 1) | 整数运算 |
| 移码 | 真值加偏置 | 真值加偏置 | 1 个 | -2ⁿ⁻¹ 到 +(2ⁿ⁻¹ – 1) | 浮点数阶码 |
最重要的考点是:
正数:原码 = 反码 = 补码
负数:原码、反码、补码不同
移码:常用于阶码;与补码只差最高位
四、不同码之间如何转换
1. 真值转原码、反码、补码
以 8 位表示 -45 为例。
先写出绝对值:
45 = 0101101
因为是 8 位机器数,所以 1 位符号位 + 7 位数值位。
原码:
[-45]原 = 10101101
反码:
[-45]反 = 11010010
补码:
[-45]补 = 11010011
移码:
[-45]移 = [-45]补 的最高位取反
= 01010011
2. 原码转反码、补码
如果是正数:
原码 = 反码 = 补码
如果是负数:
原码 → 反码:符号位不变,数值位取反
反码 → 补码:末位加 1
例:
[-45]原 = 10101101
符号位不变,数值位取反:
[-45]反 = 11010010
反码加 1:
[-45]补 = 11010011
3. 补码转真值
这是做题最常用的转换。
如果补码最高位是 0,表示非负数,直接按普通二进制读。
例如 8 位补码:
00101101
最高位是 0,所以是真值:
+45
如果补码最高位是 1,表示负数。有两种常用方法。
第一种方法:取反加 1 求绝对值。
补码:11010011
取反:00101100
加 1:00101101 = 45
所以真值是:
-45
第二种方法:直接用无符号值减模数。
8 位补码的模数是:
2⁸ = 256
11010011 按无符号数读是:
211
所以真值是:
211 - 256 = -45
这一招做选择题很快。
4. 补码转原码、反码
如果补码是正数,三者相同。
如果补码是负数:
补码 → 反码:补码减 1
反码 → 原码:符号位不变,数值位取反
例如:
[-45]补 = 11010011
先减 1:
[-45]反 = 11010010
再数值位取反:
[-45]原 = 10101101
也可以直接:
负数补码 → 原码:符号位不变,数值位取反加 1
但是要注意一个特殊情况:
10000000
在 8 位补码中表示 -128,它没有对应的 8 位原码和反码。因为 8 位原码、反码的范围只有 -127 到 +127。
5. 补码和移码互转
同位数下最简单:
补码 ↔ 移码:最高位取反,其余位不变
例如:
[-45]补 = 11010011
[-45]移 = 01010011
[+45]补 = 00101101
[+45]移 = 10101101
从移码转真值也可以用偏置法。
例如 8 位移码:
01010011
按无符号数读:
83
偏置值是:
128
所以真值:
83 - 128 = -45
五、定点小数中的原码、反码、补码
408 有时还会考定点小数,比如:
x = -0.1011
这时最高位仍然是符号位,小数点通常隐含在符号位后面:
1.1011
原码:
[x]原 = 1.1011
反码:
[x]反 = 1.0100
补码:
[x]补 = 1.0101
规则和整数类似:
正数:原码 = 反码 = 补码
负数:原码数值位取反得反码,反码末位加 1 得补码
定点小数补码的范围也要注意。若一共有 n 位,其中 1 位符号位,n-1 位小数位,则补码小数范围是:
-1 到 +(1 - 2⁻⁽ⁿ⁻¹⁾)
例如 8 位定点小数补码:
1 位符号位 + 7 位小数位
范围是:
-1 到 +(1 - 2⁻⁷)
也就是:
-1 到 +0.9921875
这里也体现出补码多表示了一个最小负数。
六、什么是变形补码、变形反码
变形补码、变形反码主要用于判断加减运算是否溢出。它们的核心特征是:
使用两个符号位
普通补码只有一个符号位,例如:
0.xxxx 表示正数
1.xxxx 表示负数
变形补码使用两个符号位:
00.xxxx 表示正数
11.xxxx 表示负数
也就是说,正常情况下两个符号位应该相同。
做加减运算后,如果结果的两个符号位不同,就说明发生溢出:
00:正数,无溢出
11:负数,无溢出
01:正溢出
10:负溢出
这就是变形补码最常考的地方。
例如:
两个正数相加,结果却出现 01.xxxx
说明发生正溢出。
再如:
两个负数相加,结果却出现 10.xxxx
说明发生负溢出。
变形反码也类似,也是通过两个符号位辅助判断溢出。不过在 408 中,真正高频的是补码加减法和变形补码溢出判断。反码更多用于理解编码体系,实际运算题考得少。
七、这种题型应该怎么做
遇到原码、反码、补码、移码题,不要直接凭感觉读二进制。先按下面顺序判断。
第一步,看题目给的是“真值”还是“机器数”。
如果题目给的是:
x = -45
x = -0.1011
这是给真值,要转机器数。
如果题目给的是:
[x]补 = 11010011
[x]移 = 01010011
这是给机器数,要按指定编码还原真值,或者转成其他编码。
第二步,看位数。
例如题目说“用 8 位表示”,就必须明确:
8 位包括符号位
-45 的绝对值 45 要写成 7 位数值位:
45 = 0101101
不是随便写成 101101。
第三步,看编码类型。
如果是原码,负数就是:
符号位 1 + 绝对值
如果是反码,负数就是:
原码数值位取反
如果是补码,负数就是:
反码加 1
如果是移码,优先用:
移码 = 真值 + 偏置值
或者在同位数下用:
移码 = 补码最高位取反
第四步,看是否有特殊值。
最常见特殊值是:
10000000
在 8 位补码中,它表示:
-128
不是 -0。
而在 8 位原码中:
10000000
表示:
-0
在 8 位反码中:
11111111
表示:
-0
这些是选择题常挖的坑。
八、典型例题:8 位机器数转换
题目:求 x = -45 的 8 位原码、反码、补码、移码。
先写绝对值:
45 = 0101101
原码:
[-45]原 = 10101101
反码:
[-45]反 = 11010010
补码:
[-45]补 = 11010011
移码:
[-45]移 = 01010011
最终答案:
原码:10101101
反码:11010010
补码:11010011
移码:01010011
九、典型例题:已知补码求真值
题目:已知 8 位补码:
[x]补 = 11101010
求真值 x。
最高位是 1,说明 x 是负数。
方法一,取反加 1:
补码:11101010
取反:00010101
加 1:00010110
00010110 是 22,所以:
x = -22
方法二,按无符号数减模数:
11101010 = 234
234 - 256 = -22
答案:
x = -22
十、最容易错的地方
最容易错的第一点是把“机器数”和“真值”混在一起。11010011 本身不能直接说是 -45,必须先知道它是补码。如果它是无符号数,就是 211;如果它是补码,才是 -45。
第二点是忘记位数。8 位、16 位、n 位会影响补码的模数,也会影响移码的偏置值。8 位补码负数可以用“无符号值 – 256”,16 位补码负数则是“无符号值 – 65536”。
第三点是把移码当成普通符号位编码。移码的最高位不是传统意义上的符号位。同位数下,移码和补码只是最高位相反。
第四点是把 10000000 误判成 -0。在 8 位补码中它是 -128;在 8 位原码中它才是 -0。
第五点是忘记正数规则。正数的原码、反码、补码完全一样;只有负数才需要取反、加一。
十一、快速记忆
可以这样记:
原码:符号 + 绝对值
反码:负数原码数值位取反
补码:负数反码加 1
移码:补码符号位取反
再压缩成一句:
正数三码相同,负数反码取反,补码再加一,移码翻最高位。
其中“三码”通常指:
原码、反码、补码
做题时优先抓住:
给真值 → 先写绝对值 → 再按编码规则转换
给机器数 → 先看编码类型 → 再还原真值
补码负数 → 取反加 1 求绝对值,或者无符号值减模数
移码 ↔ 补码 → 最高位取反
变形补码 → 看两个符号位是否相同
这部分在 408 里不难,但非常容易因为“位数、符号位、特殊值、移码最高位”丢分。核心是每道题先问自己三个问题:几位?什么码?要求真值还是机器数?

图中 04~09 的答案是:
04:B
05:B
06:D
07:C
08:D
09:C
下面逐题解析。
04. 对真值 0 表示形式唯一的机器数是?
题目问的是:哪种机器数表示法中,真值 0 只有一种表示形式。
原码中有两个 0:
[+0]原 = 00000000
[-0]原 = 10000000
反码中也有两个 0:
[+0]反 = 00000000
[-0]反 = 11111111
补码中只有一个 0:
[0]补 = 00000000
移码中 0 也只有一个表示。例如 8 位移码偏置值为 128:
[0]移 = 0 + 128 = 128 = 10000000
所以真值 0 表示形式唯一的是:
补码和移码
答案选:
04:B
这题的易错点是把“机器数编码个数”和“真值表示个数”混淆。原码、反码不是不能表示 0,而是有 +0 和 -0 两种表示。
05. 若 [X]补 = 1.1101010,则 [X]原 = ?
题目给的是补码:
[X]补 = 1.1101010
最高位是 1,说明 X 是负数。
负数由补码求原码,常用方法是:
符号位不变,数值位取反加 1
也可以理解为先由补码减 1 得反码,再由反码取反得原码。
直接做:
补码:1.1101010
数值位取反:0010101
末位加 1 :0010110
符号位仍然是 1,所以:
[X]原 = 1.0010110
答案选:
05:B
注意这里的小数点只是定点小数的隐含位置,不影响“负数补码转原码”的规则。符号位在小数点左边,数值位在小数点右边。
06. 若 X 为负数,则由 [X]补 求 [-X]补 是将什么?
题目问的是:已知一个负数 X 的补码,怎样得到它的相反数 -X 的补码。
补码中求相反数的通用方法是:
连同符号位一起取反,末位加 1
也就是“按位取反加 1”。
举个例子:
X = -45
[X]补 = 11010011
求 [-X]补,也就是求 +45 的补码:
11010011 取反 = 00101100
末位加 1 = 00101101
而:
[+45]补 = 00101101
所以规则正确。
答案选:
06:D
这题容易误选 C。C 说“除符号位外,各位变反,末位加 1”,这是把符号位排除掉了,不是补码求相反数的规则。补码求相反数必须连同符号位一起参与取反。
07. 8 位原码能表示的不同数据有几个?
8 位原码一共有:
2⁸ = 256
种机器编码。
但是原码中有两个编码都表示 0:
00000000 表示 +0
10000000 表示 -0
它们的真值都是 0,所以“不同数据”要少算一个。
因此 8 位原码能表示的不同数据个数是:
256 - 1 = 255
答案选:
07:C
这题的关键词是“不同数据”,不是“不同编码”。如果问“8 位原码机器数有多少种编码”,答案才是 256;但问“不同数据”或“不同真值”,答案是 255。
08. 一个 n + 1 位整数 x 原码的数值范围是?
n + 1 位原码整数,表示:
1 位符号位 + n 位数值位
n 位数值位能表示的最大绝对值是:
2ⁿ - 1
所以原码整数范围是:
-(2ⁿ - 1) 到 +(2ⁿ - 1)
也就是:
-2ⁿ + 1 ≤ x ≤ 2ⁿ - 1
答案选:
08:D
原码、反码的整数范围都是:
-2ⁿ + 1 ≤ x ≤ 2ⁿ - 1
补码的整数范围才是:
-2ⁿ ≤ x ≤ 2ⁿ - 1
这里题目说的是 n + 1 位,其中 1 位符号位,所以数值位是 n 位。不要把 n 当成总位数。
09. 定点整数为 64 位,含 1 位符号位,采用补码表示的绝对值最大的负数是?
64 位定点整数,含 1 位符号位,说明总位数就是 64 位。
补码整数的表示范围是:
-2⁶³ 到 2⁶³ - 1
所以补码能表示的最小负数是:
-2⁶³
它的绝对值最大:
|-2⁶³| = 2⁶³
因此答案选:
09:C
这里要注意题干说的是“绝对值最大的负数”,不是“最大的负数”。如果只说“最大的负数”,数学上最大负数应该是最接近 0 的负数,比如 -1;但“绝对值最大的负数”就是最小的那个补码负数,即 -2⁶³。
这几题的统一做法
这一组题基本都围绕一个主线:不同编码方式的 0、范围、相反数、负数转换。
可以直接记下面几条:
原码:有 +0 和 -0,范围为 -2ⁿ + 1 到 2ⁿ - 1
反码:有 +0 和 -0,范围为 -2ⁿ + 1 到 2ⁿ - 1
补码:0 唯一,范围为 -2ⁿ 到 2ⁿ - 1
移码:0 唯一,常用于阶码,和补码只差最高位
其中这里的 n 是数值位位数。如果总位数是 n + 1 位,那么就是 1 位符号位 + n 位数值位。
再记两个转换规则:
负数补码转原码:符号位不变,数值位取反加 1
补码求相反数:连同符号位一起取反,末位加 1
所以这几道题的本质是:
04 考 0 的唯一性
05 考负数补码转原码
06 考补码求相反数
07 考原码的 +0 和 -0
08 考 n+1 位原码范围
09 考 64 位补码最小负数
在求补码到原码的转换,或者是求补码的相反数的补码,是通过符号位也取反,然后末尾加一来解决的,我们已知原码到补码是取反再加一,那么根据逆推应该是先减一再取反,为什么是直接取反加一?
这里要把两个操作严格分开:
① 负数的补码 → 原码
② 已知 [X]补,求 [-X]补
这两个不是同一件事,所以“符号位是否参与取反”不一样。
一、补码转原码:符号位不变,只处理数值位
如果已知:
[X]补 = 1.1101010
最高位是 1,说明 X 是负数。求 [X]原 时,符号位仍然应该是 1,因为 X 还是负数。这里只是在恢复它的绝对值部分。
所以补码转原码的标准逆过程确实是:
补码 → 反码:末位减 1
反码 → 原码:符号位不变,数值位取反
对题目:
[X]补 = 1.1101010
只看数值位:
1101010
先减 1:
1101010 - 1 = 1101001
再取反:
1101001 取反 = 0010110
所以:
[X]原 = 1.0010110
这就是你说的“逆推”:先减一,再取反。这个思路完全正确。
二、那为什么也可以“取反加一”?
因为在固定长度二进制中,取反加一这个操作是自反的。也就是说,对同样长度的二进制数:
先减 1 再取反
和:
先取反再加 1
结果相同。
仍然用数值位 1101010 来看。
方法一:先减一,再取反:
1101010 - 1 = 1101001
1101001 取反 = 0010110
方法二:先取反,再加一:
1101010 取反 = 0010101
0010101 + 1 = 0010110
结果一样,都是:
0010110
所以对于“负数补码转原码”,可以说:
符号位不变,数值位取反加 1
也可以说:
符号位不变,数值位减 1 后取反
二者等价。
但这里必须强调:补码转原码时,符号位不能参与取反。
如果把符号位也取反,就不是在求原码了。
三、补码求相反数的补码:符号位也参与取反
另一类题是:
已知 [X]补,求 [-X]补
这不是“补码转原码”,而是在补码体系中求相反数。
补码体系下有一个统一规则:
[-X]补 = [X]补 连同符号位一起取反,再末位加 1
例如:
X = -45
[X]补 = 11010011
求 [-X]补,也就是求 +45 的补码。
连同符号位一起取反:
11010011 取反 = 00101100
末位加 1:
00101100 + 1 = 00101101
所以:
[-X]补 = 00101101
而 00101101 正好就是 +45 的补码。
这里符号位必须参与取反,因为结果的符号确实变了:原来 X 是负数,-X 是正数。
四、关键区别:一个是“换表示”,一个是“变数值”
这部分最容易混,是因为两个操作都出现了“取反加一”。
本质区别如下:
| 操作 | 真值是否改变 | 符号是否改变 | 符号位是否参与 |
|---|---|---|---|
[X]补 → [X]原 | 不改变,还是 X | 不改变 | 不参与,符号位保留 |
[X]补 → [-X]补 | 改变,变成 -X | 通常改变 | 参与,整个位串取反加一 |
比如:
[X]补 = 11010011
如果问 [X]原,这是同一个数 X,只是换一种表示法:
[X]补 = 11010011
[X]原 = 10101101
真值仍然是:
X = -45
但如果问 [-X]补,那就是求相反数:
[X]补 = 11010011
[-X]补 = 00101101
真值变成:
-X = +45
所以这两个结果当然不同。
五、用一句话总结
负数补码转原码:
符号位不变,数值位取反加 1
或者:
符号位不变,数值位减 1 后取反
这两个等价。
补码求相反数的补码:
连同符号位一起取反,末位加 1
所以判断时先问自己:题目是让“换编码表示”,还是让“求相反数”?
换编码:符号位不变
求相反数:符号位参与运算
这是这类题的核心分界线。

先给答案:
| 题号 | 答案 |
|---|---|
| 11 | C |
| 12 | C |
| 13 | D(严格说;若答案给 B,是把“正数”不严谨地当成“非负数”) |
| 14 | B |
| 15 | C |
| 16 | A |
| 17 | D |
| 18 | B |
| 19 | D |
| 20 | C |
| 21 | B |
| 22 | A |
| 23 | A |
| 24 | D |
下面逐题讲。
11 题
题目给:
[x]补 = 1, x₁x₂x₃x₄x₅x₆
这是 7 位补码,最高位为符号位 1,说明 x 是负数。对 7 位补码整数来说,符号位权值为 -2⁶ = -64,其余 6 位权值依次为:
x₁:32, x₂:16, x₃:8, x₄:4, x₅:2, x₆:1
所以:
x = -64 + x₁×32 + x₂×16 + x₃×8 + x₄×4 + x₅×2 + x₆
要求:
x > -32
即:
-64 + 后6位的无符号值 > -32
所以:
后6位的无符号值 > 32
后 6 位要大于 32,必须满足:
x₁ = 1,并且 x₂ ~ x₆ 中至少有一位为 1。
如果只是 x₁=1 且后面全 0,则后 6 位为 100000 = 32,此时 x = -32,不满足 x > -32。
因此选 C。
12 题
题目给:
[x]补 = 1, x₁x₂x₃x₄x₅
这是 6 位补码,最高位符号位为 1,说明 x 是负数。6 位补码符号位权值为:
-2⁵ = -32
其余 5 位权值为:
x₁:16, x₂:8, x₃:4, x₄:2, x₅:1
所以:
x = -32 + 后5位的无符号值
要求:
x < -16
即:
-32 + 后5位的无符号值 < -16
所以:
后5位的无符号值 < 16
后 5 位小于 16,说明最高的数值位 x₁ 必须为 0,后面的 x₂ ~ x₅ 任意。
因此选 C。
这类题的核心规律是:补码负数不需要先转原码,可以直接用权值算。n 位补码最高位权值是负的,其余位权值正常为正。
13 题
题目说:
x 为真值,x* 为其绝对值,满足:
[-x*]补 = [-x]补
问当且仅当什么条件成立。
因为 x* = |x|,所以左边代表:
[-x*]补 = [-|x|]补
右边代表:
[-x]补
比较真值即可。
如果 x > 0,那么:
|x| = x
所以:
-|x| = -x
两边相等。
如果 x = 0,那么:
|x| = 0
所以:
-|x| = -0 = 0
右边也是:
-x = 0
两边也相等。
如果 x < 0,假设 x = -a,则 a > 0:
|x| = a
左边真值:
-|x| = -a
右边真值:
-x = a
显然不相等。
所以严格条件应为:
x ≥ 0
选项中没有“x 为非负数”,所以严格来说选 D:以上说法都不对。
这里容易错在看到“正数”就选 B,但 0 也满足等式。如果参考答案给 B,说明它忽略了 0,这种答案不够严谨。
14 题
十进制数为 -66,用 8 位补码表示。
先写出 +66:
66 = 0100 0010
负数补码求法:正数源码按位取反再加 1。
取反:
1011 1101
加 1:
1011 1110
二进制 1011 1110 转十六进制:
BEH
因此选 B。
A 选项 C2H = 1100 0010 是 -66 的原码,不是补码。
15 题
寄存器内容为:
9BH
转成二进制:
1001 1011
最高位为 1,说明这是补码负数。
方法一:直接按 8 位补码计算:
0x9B = 155
补码真值:
155 - 256 = -101
所以对应十进制数为 -101。
因此选 C。
方法二:求其绝对值。
1001 1011 按位取反:
0110 0100
加 1:
0110 0101 = 101
所以原数为 -101。
16 题
寄存器内容为:
10000000
如果它表示 -0,问是哪种码。
原码中:
+0 = 00000000
-0 = 10000000
反码中:
+0 = 00000000
-0 = 11111111
补码中 0 的表示唯一,没有 -0。
因此 10000000 表示 -0 时,是原码。
选 A。
17 题
寄存器内容为:
11111111
如果它等于 +127,问是哪种码。
8 位移码通常采用偏置值 128:
[x]移 = x + 128
如果 x = +127,则:
[+127]移 = 127 + 128 = 255
255 的 8 位二进制就是:
11111111
因此选 D,移码。
顺便对比:
原码 11111111 表示 -127;
反码 11111111 表示 -0;
补码 11111111 表示 -1。
18 题
寄存器内容为:
11111111
如果它等于 -1,问是哪种码。
8 位补码中:
-1 的补码为:
11111111
因为:
+1 = 00000001
取反:
11111110
加 1:
11111111
因此选 B,补码。
19 题
寄存器内容为:
00000000
如果它等于 -128,问是哪种码。
8 位移码偏置值为 128:
[x]移 = x + 128
若 x = -128,则:
[-128]移 = -128 + 128 = 0
即:
00000000
因此选 D,移码。
补码中 00000000 表示 0,不表示 -128。8 位补码的 -128 是 10000000。
20 题
真值为二进制定点小数:
-0.1101
机器表示为:
1.0010
判断是哪种码。
先看原码。
负数原码:符号位为 1,数值位保持绝对值不变。
所以:
[-0.1101]原 = 1.1101
反码:符号位不变,数值位按位取反。
1.1101 的数值位 1101 取反为 0010
所以:
[-0.1101]反 = 1.0010
正好等于题目给的机器表示。
因此选 C,反码。
如果是补码,还要在反码基础上末位加 1:
1.0010 + 0.0001 = 1.0011
所以不是补码。
21 题
题目问:下列为 8 位移码机器数 [x]移,求 [-x]移 时,哪个会发生溢出。
8 位移码偏置值为 128,真值范围仍然是:
-128 ~ +127
移码关系为:
[x]移 = x + 128
逐个看。
A:11111111
无符号值为 255:
x = 255 - 128 = 127
求 -x = -127,可表示,不溢出。
B:00000000
无符号值为 0:
x = 0 - 128 = -128
求 -x = +128
但 8 位带符号整数范围最大只能到 +127,所以 +128 不可表示,溢出。
C:10000000
无符号值为 128:
x = 128 - 128 = 0
求 -x = 0,不溢出。
D:01111111
无符号值为 127:
x = 127 - 128 = -1
求 -x = +1,不溢出。
因此选 B。
这题和补码里的特殊值一样:最小负数取相反数会溢出。
22 题
题目说:一个 8 位二进制整数由 2 个 0 和 6 个 1 组成,采用补码或移码表示,判断哪项正确。
先看移码。
A 选项
若采用移码表示,偏置值为 127,求此整数最小值。
8 位机器码由 2 个 0 和 6 个 1 组成。要让移码对应的真值最小,就要让机器码无符号值最小。
无符号值最小的排列是:
00111111
即十进制 63。
偏置值为 127,所以:
x = 63 - 127 = -64
A 正确。
B 选项
偏置值为 128,求最大值。
要让机器码无符号值最大,就把两个 0 放在最低位:
11111100
其无符号值为:
252
真值:
x = 252 - 128 = 124
不是 123,所以 B 错。
C 选项
若采用补码表示,求最小值。
补码中要得到最小值,符号位必须为 1。由于总共有 6 个 1、2 个 0,所以符号位占掉一个 1,剩下 7 位中还有 5 个 1、2 个 0。
负数补码的真值为:
x = 无符号值 - 256
要让 x 最小,就要让机器码无符号值尽量小。因此低 7 位中,两个 0 应放在最高的两个数值位上:
10011111
其无符号值为:
128 + 16 + 8 + 4 + 2 + 1 = 159
真值:
159 - 256 = -97
不是 -96,所以 C 错。
D 选项
若采用补码表示,求最大值。
补码最大值需要符号位为 0。总共有 6 个 1、2 个 0,符号位用掉一个 0,低 7 位中还剩 6 个 1、1 个 0。
为了最大,低 7 位的 0 放在最低位:
01111110
其值为:
126
不是 252,所以 D 错。
因此选 A。
23 题
题目说:用 2 个 1 和 6 个 0 组成 8 位二进制补码,问所能表示的最大整数和最小整数之差。
先求最大整数。
补码最大值必须符号位为 0。总共有 2 个 1、6 个 0,符号位为 0 后,低 7 位中还有 2 个 1。为了最大,把两个 1 放在最高的数值位:
01100000
真值为:
64 + 32 = 96
再求最小整数。
补码最小值需要符号位为 1。总共有 2 个 1,符号位占掉一个 1,低 7 位中还剩 1 个 1。为了让负数尽可能小,低 7 位的值要尽量小,所以把这个 1 放在最低位:
10000001
真值为:
129 - 256 = -127
所以最大整数和最小整数之差为:
96 - (-127) = 223
因此选 A。
这题容易误以为最小值是 10000000 = -128,但它只有 1 个 1,不满足“2 个 1 和 6 个 0”。
24 题
题目问补码表示的特点。
逐条判断:
I. 零的表示是唯一的。
正确。补码中只有一个 0:
00000000
不像原码、反码有 +0 和 -0 两种表示。
II. 符号位可以和数值部分一起参加运算。
正确。补码的最大优点之一就是符号位可以直接参与加减运算,不需要单独处理符号。
III. 和其真值的对应关系简单、直观。
错误。这个更像是原码的特点。原码符号位表示正负,数值位直接表示绝对值,比较直观。补码负数的数值位不是绝对值,理解上不如原码直观。
IV. 减法可用加法来实现。
正确。因为:
A - B = A + (-B)
而补码系统中负数可以直接用补码参与加法运算,所以减法可以转化为加法。
因此正确的是 I、II、IV。
选 D。
这组题的通用做法
这几题本质上考四件事。
第一,补码整数可以直接按权值算。n 位补码最高位权值是 -2ⁿ⁻¹,其余位权值正常为正。例如 8 位补码:
b₇b₆b₅b₄b₃b₂b₁b₀
真值为:
-b₇×128 + b₆×64 + b₅×32 + ... + b₀
或者把机器码先当无符号数 U:
若最高位为 0,真值就是 U;
若最高位为 1,真值就是:
U - 2⁸
第二,移码直接用偏置值。常见 8 位移码偏置值为 128:
[x]移 = x + 128
所以:
x = [x]移的无符号值 - 128
若题目明确说偏置值为 127,就用:
x = [x]移的无符号值 - 127
第三,原码、反码、补码的 0 和特殊值要记清楚。
8 位情况下:
10000000
在原码中表示 -0;
在补码中表示 -128;
在移码中表示 0,因为 128 - 128 = 0。
11111111
在补码中表示 -1;
在反码中表示 -0;
在原码中表示 -127;
在移码中表示 +127。
第四,排列 0 和 1 求最大最小时,不要急着转原码,要先看符号位。
补码求最大:符号位尽量为 0,剩余的 1 尽量放高位。
补码求最小:符号位必须为 1,然后低位部分尽量小,因为负数补码真值是 无符号值 - 2ⁿ。
移码求最大或最小:直接看机器码无符号值最大或最小,再减偏置值。
移码与偏移值的关系?比方说寄存器内容长度为八位,那么,不是默认偏移为八位,并且以码数值的计算,是不是相对于补码,还是说如果长度为8位,但是它的偏移值不一定为八位
不是“长度为 8 位,所以偏移为 8 位”。这里要分清两个概念:
机器字长是 8 位,表示这个移码机器数一共有 8 个二进制位;偏移值、偏置值是一个常数,不是“几位”的意思。
对于 n 位移码,常见关系是:
[x]移 = x + 偏置值
x = [x]移的无符号值 - 偏置值
在计算机组成原理、408 风格题目中,如果题目说“8 位移码”而没有额外说明,很多教材默认偏置值取:
偏置值 = 2⁷ = 128
也就是一般 n 位移码默认:
偏置值 = 2ⁿ⁻¹
所以 8 位时是 128,不是 8。
例如 8 位移码 11111111,把它先当作无符号数看:
11111111₂ = 255
若偏置值为 128,则:
x = 255 - 128 = 127
所以它表示 +127。
再比如:
00000000₂ = 0
x = 0 - 128 = -128
所以 8 位移码 00000000 表示 -128。
这正是上一题里为什么 00000000 可以表示 -128,11111111 可以表示 +127。
移码不是“相对于补码计算”的,它本质上是“真值加偏置值”。不过在偏置值取 2ⁿ⁻¹ 时,移码和补码之间有一个很重要的快捷关系:
[x]移 = [x]补 的符号位取反
注意:只取反最高符号位,其他位不变。
例如 8 位补码中:
+5 的补码 = 00000101
+5 的移码 = 10000101
只把最高位从 0 改成 1。
再看负数:
-5 的补码 = 11111011
-5 的移码 = 01111011
只把最高位从 1 改成 0。
所以做题时可以这样区分:
原码:符号位表示正负,数值位表示绝对值
反码:负数在原码基础上数值位取反
补码:负数在反码基础上末位加 1
移码:真值加偏置值;若偏置值为 2ⁿ⁻¹,则等于补码符号位取反
但是要特别注意:移码的偏置值不一定永远是 128。它取决于题目约定。
8 位移码常见有两种偏置:
偏置值 = 128,也就是 2⁷
偏置值 = 127,也就是 2⁷ - 1
408 和组成原理普通定点整数移码题里,若无特殊说明,通常按 2ⁿ⁻¹,即 8 位取 128。
但浮点数阶码中,尤其涉及 IEEE 754 单精度浮点数时,8 位阶码的偏置值通常是:
127
也就是 2⁷ - 1。
所以遇到题目时要按这个优先级判断:
第一,如果题目明确写“偏置值为多少”,必须按题目给的偏置值来算。
第二,如果是普通组成原理移码整数题,常默认 n 位移码偏置值为 2ⁿ⁻¹。8 位就是 128。
第三,如果是 IEEE 754 浮点数阶码,8 位阶码偏置值通常是 127。
举个对比:
同样是 8 位机器码:
11111111₂ = 255
若偏置值为 128:
x = 255 - 128 = 127
若偏置值为 127:
x = 255 - 127 = 128
结果就不同。
所以不能只看到“8 位”就机械地说偏置一定是 128,更不能说偏置是 8。准确说法应该是:
8 位移码若按普通定点整数移码,通常默认偏置值为 2⁷ = 128;
但若题目明确给出偏置值,或属于 IEEE 754 浮点阶码,则必须按题目或标准来。
对于考研做题,最稳的判断方法是:
移码真值 = 机器码无符号值 - 偏置值
如果没有给偏置值,再根据题型判断默认偏置。普通移码整数题多数取 2ⁿ⁻¹;浮点阶码题常见取 2ᵏ⁻¹ - 1。

26 到 34 的答案依次是:
26. B
27. B
28. B
29. D
30. D
31. A
32. D
33. B
34. D
这组题集中考的是“补码、符号扩展、零扩展、C 语言有符号/无符号转换”。做这类题时,不要只看十进制值,关键是先确定“位数”和“解释方式”。
26 题
题目:16 位补码整数 0x8FA0 扩展为 32 位应该是?
16 位补码的最高位是符号位。0x8FA0 写成二进制时最高位是 1,说明它是负数。
补码扩展规则是:正数高位补 0,负数高位补 1,也叫符号扩展。
所以:
16 位:1000 1111 1010 0000
32 位:1111 1111 1111 1111 1000 1111 1010 0000
即:
0xFFFF8FA0
答案是 B。
易错点是看到十六进制直接前面补 0,写成 0x00008FA0,这是无符号数扩展或正数扩展的做法,不适用于负的补码整数。
27 题
代码:
unsigned short x = 65530;
unsigned int y = x;
已知 short 为 16 位,int 为 32 位。
先把 65530 转成 16 位无符号数:
65530 = 65536 - 6 = 0xFFFA
所以 x 的机器数是:
1111 1111 1111 1010
但注意,x 是 unsigned short,它是无符号数。无符号数扩展为更长的无符号数时,采用零扩展,也就是高位补 0。
所以:
y = 0x0000FFFA
答案是 B。
这题的陷阱在于 0xFFFA 最高位是 1,很多人会误以为要符号扩展成 0xFFFFFFFA。但这里 x 是无符号数,不看符号位,扩展时高位补 0。
28 题
题目:由 3 个 1 和 5 个 0 组成的 8 位二进制补码,能表示的最小整数是多少?
8 位补码中,如果要表示负数,最高位必须是 1。补码值的权重可以这样看:
b7 b6 b5 b4 b3 b2 b1 b0
b7 的权值是 -128
b6 到 b0 的权值分别是 64, 32, 16, 8, 4, 2, 1
题目要求一共有 3 个 1。为了让表示的整数最小,也就是尽量负,最高位必须取 1,这样先得到:
-128
剩下还需要放 2 个 1。由于低 7 位都是正权值,为了让总值尽量小,应该把这两个 1 放在权值最小的位置,即 b1 和 b0:
1000 0011
对应数值为:
-128 + 2 + 1 = -125
答案是 B。
常见误区是认为 1 越靠高位越小,但负数补码里最高位已经提供了负权值,后面低位的 1 都是在“加正数”。所以剩下的 1 应尽量放在最低位。
29 题
代码:
short si = -32767;
unsigned short usi = si;
16 位补码中:
+32767 = 0x7FFF
-32767 = 0x8001
因为:
-32767 的补码 = 32767 的原码按位取反再加 1
0x7FFF 取反 = 0x8000
0x8000 + 1 = 0x8001
赋值给 unsigned short 后,位模式不变,只是解释方式变成无符号整数。
0x8001 = 32768 + 1 = 32769
所以 usi 的值为 32769。
答案是 D。
这题要抓住一句话:同样的机器数,作为有符号补码解释和作为无符号数解释,数值可能不同。
30 题
题目:冯·诺依曼结构计算机中的数据采用二进制编码表示,主要原因是?
三个说法分别是:
I. 二进制的运算规则简单
II. 制造两个稳定态的物理器件较容易
III. 便于用逻辑门电路实现算术运算
这三个都是正确原因。
二进制只有 0 和 1,运算规则简单;硬件中用高低电平、导通/截止、磁化方向等两个稳定状态表示信息比较容易;逻辑门电路天然适合处理二值逻辑,也方便实现算术运算和逻辑运算。
答案是 D。
31 题
代码:
unsigned short usi = 65535;
short si = usi;
16 位无符号数 65535 的机器数是:
0xFFFF
赋值给 short 后,仍按 16 位补码解释。
在 16 位补码中:
0xFFFF = -1
因为 -1 的补码就是全 1。
所以 si 的值是:
-1
答案是 A。
这题和 29 题是反向考法:
有符号 short -> 无符号 short:同一机器数按无符号解释
无符号 short -> 有符号 short:同一机器数按补码解释
32 题
题目给出三个机器数:
x = FFFDH
y = FFDFH
z = 7FFCH
默认按 16 位看。
先按无符号整数解释:
x = 0xFFFD = 65533
y = 0xFFDF = 65503
z = 0x7FFC = 32764
所以无符号时大小关系是:
z < y < x
选项 A、B 都不对。
再按有符号补码解释:
x = 0xFFFD = -3
y = 0xFFDF = -33
z = 0x7FFC = 32764
因为:
0xFFFD 是 -3
0xFFDF 是 -33
0x7FFC 最高位为 0,是正数 32764
所以有符号时:
y < x < z
答案是 D。
这类题的关键是:同一个机器数,按无符号解释和按补码解释,排序结果可能完全不同。最高位为 1 的数,在无符号中很大,在有符号补码中是负数。
33 题
题目:32 位补码所能表示的整数范围是?
n 位补码的表示范围是:
-2<sup>n-1</sup> 到 2<sup>n-1</sup> - 1
所以 32 位补码整数范围是:
-2<sup>31</sup> 到 2<sup>31</sup> - 1
答案是 B。
这里注意补码范围不是对称的,负数比正数多一个。原因是补码中 1000...0000 表示最小负数 -2<sup>n-1</sup>,没有对应的正数 +2<sup>n-1</sup>。
34 题
代码:
short si = -32767;
unsigned int ui = si;
这是 2025 年统考真题,重点在于区分它和第 29 题。
第 29 题是:
short -> unsigned short
目标类型还是 16 位。
而本题是:
short -> unsigned int
目标类型是 32 位无符号整数。
si = -32767,它作为 16 位 short 的补码是:
0x8001
但是赋值给 32 位 unsigned int 时,不能简单把 0x8001 零扩展成 0x00008001。因为源操作数是有符号 short,值是 -32767。
负的有符号整数转换为无符号整数时,按模 232 转换:
ui = 2<sup>32</sup> - 32767
而:
32767 = 2<sup>15</sup> - 1
所以:
ui = 2<sup>32</sup> - (2<sup>15</sup> - 1)
= 2<sup>32</sup> - 2<sup>15</sup> + 1
答案是 D。
也可以从机器数角度理解:
short si = -32767
16 位补码:0x8001
作为有符号数扩展到 32 位:
0xFFFF8001
再作为 unsigned int 解释:
0xFFFF8001 = 2<sup>32</sup> - 32767
所以结果是:
2<sup>32</sup> - 2<sup>15</sup> + 1
这组题的统一做法
遇到这类题,先不要急着算十进制,建议固定按下面顺序判断:
第一步,看类型或题干说明是有符号还是无符号。补码整数、short、int 通常按有符号补码解释;unsigned short、unsigned int 按无符号解释。
第二步,看位数。16 位和 32 位是这组题的核心。16 位范围是:
有符号 short:-32768 到 32767
无符号 short:0 到 65535
32 位范围是:
有符号 int:-2<sup>31</sup> 到 2<sup>31</sup> - 1
无符号 int:0 到 2<sup>32</sup> - 1
第三步,看是否发生扩展。规则是:
有符号补码扩展:符号扩展,正数高位补 0,负数高位补 1
无符号数扩展:零扩展,高位补 0
第四步,看是否发生有符号/无符号转换。同一串机器数,如果按不同类型解释,数值不同。例如:
0xFFFF 作为 unsigned short 是 65535
0xFFFF 作为 signed short 是 -1
最后特别注意第 34 题这种考法:负的有符号数转换为更长的无符号数,不是把原 16 位机器数直接零扩展,而是按目标无符号类型的模数转换。也就是:
-32767 转 unsigned int = 2<sup>32</sup> - 32767
从27题开始给一个数,然后得到了一个16进制数,但是你是又如何求它的二进制,以确定首位数字是零还是一?,如何快速的通过这个十进制到16进制到2进制的转换?
关键点是:十六进制和二进制之间不需要重新计算。因为 1 位十六进制正好对应 4 位二进制。
1 个十六进制位 = 4 个二进制位
0xF = 1111
0xA = 1010
0x8 = 1000
0x7 = 0111
所以从十六进制判断二进制最高位是不是 1,通常只看最高的那个十六进制位即可。
一、先记住十六进制和二进制的固定对应表
这个表必须熟练:
0 = 0000
1 = 0001
2 = 0010
3 = 0011
4 = 0100
5 = 0101
6 = 0110
7 = 0111
8 = 1000
9 = 1001
A = 1010
B = 1011
C = 1100
D = 1101
E = 1110
F = 1111
因此判断最高位是否为 1 的最快方法是:
最高十六进制位是 0 ~ 7 :最高二进制位是 0
最高十六进制位是 8 ~ F :最高二进制位是 1
例如:
0x7FFF 的最高十六进制位是 7
所以最高二进制位是 0
0x8001 的最高十六进制位是 8
所以最高二进制位是 1
0xFFFA 的最高十六进制位是 F
所以最高二进制位是 1
二、必须先确定“位数”,再看最高位
这是考研题里最容易错的地方。
如果题目说是 16 位,那么就应该写成 4 位十六进制数:
16 位 = 4 个十六进制位
如果题目说是 32 位,那么就应该写成 8 位十六进制数:
32 位 = 8 个十六进制位
例如:
0x7FA
如果作为普通十六进制数,它最高位是 7。
但如果题目说它是 16 位机器数,就应该补成:
0x07FA
这时最高十六进制位是 0,所以最高二进制位是 0。
所以判断补码正负时,不是随便看最左边那个非零十六进制位,而是要看固定位数下的最高位。
常见位数对应关系:
8 位 = 2 个十六进制位
16 位 = 4 个十六进制位
32 位 = 8 个十六进制位
64 位 = 16 个十六进制位
三、以第 27 题为例:65530 怎么变成 0xFFFA?
第 27 题是:
unsigned short x = 65530;
unsigned int y = x;
unsigned short 是 16 位无符号数,所以范围是:
0 ~ 65535
而:
65535 = 0xFFFF
65536 = 0x10000
所以:
65530 = 65536 - 6
也就是:
0x10000 - 0x0006 = 0xFFFA
因此:
65530 = 0xFFFA
再把 0xFFFA 转成二进制,不需要重新除 2,只需要逐位替换:
F F F A
1111 1111 1111 1010
所以:
0xFFFA = 1111 1111 1111 1010
最高位是 1。
但是注意,这里 x 是 unsigned short,虽然机器数最高位是 1,但它不是负数。因为无符号数没有符号位,0xFFFA 按无符号解释就是 65530。
四、为什么 65530 可以快速看成 0xFFFA?
考研里很多数都靠近边界值,不建议每次都老老实实除 16。常用边界要记住:
2^8 = 256 = 0x100
2^15 = 32768 = 0x8000
2^16 = 65536 = 0x10000
2^31 = 2147483648 = 0x80000000
2^32 = 4294967296 = 0x100000000
所以:
65535 = 2^16 - 1 = 0xFFFF
65534 = 2^16 - 2 = 0xFFFE
65533 = 2^16 - 3 = 0xFFFD
65530 = 2^16 - 6 = 0xFFFA
因为:
0xFFFF - 5 = 0xFFFA
或者:
0x10000 - 0x0006 = 0xFFFA
这比十进制一步步转换快很多。
五、普通十进制转十六进制的方法:除 16 取余
如果不是靠近边界的数,就用除 16 取余法。
还是以 65530 为例:
65530 ÷ 16 = 4095 余 10 -> A
4095 ÷ 16 = 255 余 15 -> F
255 ÷ 16 = 15 余 15 -> F
15 ÷ 16 = 0 余 15 -> F
从下往上读:
FFFA
所以:
65530 = 0xFFFA
不过在考研选择题中,更常用的是边界法,因为题目经常围绕 32767、32768、65535、65536、-1、-32768 这些数设计。
六、判断最高二进制位的最快规则
1. 16 位数
16 位数写成 4 位十六进制:
0x0000 ~ 0x7FFF :最高位为 0
0x8000 ~ 0xFFFF :最高位为 1
所以:
0x7FFF 最高位是 0
0x8000 最高位是 1
0x8001 最高位是 1
0xFFFA 最高位是 1
如果按 16 位补码解释:
0x0000 ~ 0x7FFF 表示非负数
0x8000 ~ 0xFFFF 表示负数
2. 32 位数
32 位数写成 8 位十六进制:
0x00000000 ~ 0x7FFFFFFF :最高位为 0
0x80000000 ~ 0xFFFFFFFF :最高位为 1
如果按 32 位补码解释:
0x00000000 ~ 0x7FFFFFFF 表示非负数
0x80000000 ~ 0xFFFFFFFF 表示负数
七、几个常见数要形成条件反射
1. 32767
32767 = 2^15 - 1 = 0x7FFF
16 位二进制是:
0111 1111 1111 1111
最高位是 0,是 16 位补码最大正数。
2. 32768
32768 = 2^15 = 0x8000
16 位二进制是:
1000 0000 0000 0000
如果按无符号数解释,它是 32768。
如果按 16 位补码解释,它是:
-32768
3. 65535
65535 = 2^16 - 1 = 0xFFFF
16 位二进制是:
1111 1111 1111 1111
如果按无符号数解释:
65535
如果按 16 位补码解释:
-1
4. 65530
65530 = 2^16 - 6 = 0xFFFA
16 位二进制是:
1111 1111 1111 1010
如果按无符号数解释:
65530
如果按 16 位补码解释:
-6
因为:
0xFFFA = 2^16 - 6
在 16 位补码中,2^16 - 6 对应的就是 -6。
八、再看第 27 题为什么不能因为最高位是 1 就当负数
第 27 题里:
unsigned short x = 65530;
x 的机器数是:
0xFFFA
二进制是:
1111 1111 1111 1010
最高位确实是 1。
但它的类型是:
unsigned short
所以它是无符号数,不存在“符号位”。因此:
0xFFFA 按 unsigned short 解释 = 65530
然后赋值给:
unsigned int y = x;
源类型是无符号数,扩展到 32 位时采用零扩展:
16 位:0xFFFA
32 位:0x0000FFFA
所以第 27 题答案是:
0x0000FFFA
这就是为什么虽然 0xFFFA 的最高位是 1,但不能符号扩展成 0xFFFFFFFA。
九、做题时的快速流程
这类题建议按这个顺序:
第一步:看类型
signed 还是 unsigned?
第二步:看位数
short 是 16 位,int 是 32 位。
第三步:把数写成对应位数的十六进制
16 位写 4 个十六进制位,32 位写 8 个十六进制位。
第四步:如果需要判断补码正负,看最高十六进制位
0~7:最高二进制位为 0
8~F:最高二进制位为 1
第五步:如果发生扩展
无符号数扩展:高位补 0
有符号补码扩展:按符号位扩展,正数补 0,负数补 1
最关键的一句话是:
十六进制每一位直接对应 4 位二进制;
判断最高二进制位,只看固定位数下最高十六进制位是否在 8~F。



