真数、机器数、无符号数、有符号数,原码、反码、补码、移码的本质区别
本文最后更新于5 天前,其中的信息可能已经过时,如有错误请发送邮件到184874483@qq.com

真数是人能理解的数值,机器数是计算机内部按固定规则编码后的 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)补码过渡
补码与原码相同反码加 11 个-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

所以判断时先问自己:题目是让“换编码表示”,还是让“求相反数”?

换编码:符号位不变
求相反数:符号位参与运算

这是这类题的核心分界线。

先给答案:

题号答案
11C
12C
13D(严格说;若答案给 B,是把“正数”不严谨地当成“非负数”)
14B
15C
16A
17D
18B
19D
20C
21B
22A
23A
24D

下面逐题讲。

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 可以表示 -12811111111 可以表示 +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

但注意,xunsigned 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 放在权值最小的位置,即 b1b0

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

这组题的统一做法

遇到这类题,先不要急着算十进制,建议固定按下面顺序判断:

第一步,看类型或题干说明是有符号还是无符号。补码整数、shortint 通常按有符号补码解释;unsigned shortunsigned 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。

但是注意,这里 xunsigned 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

不过在考研选择题中,更常用的是边界法,因为题目经常围绕 32767327686553565536-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。
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇