这类笔记最值得先看的不是它有多全,而是能不能帮你把“原码、反码、补码”这个高频考点,从一堆抽象概念变成能直接做题、能快速判断的清晰思路。很多同学复习408时,感觉概念都懂,但一做真题,尤其是涉及负数运算、溢出判断或者特定题型时,就容易卡壳。这篇笔记的价值,就在于用“一图流”这种高度结构化的方式,帮你把零散的知识点串联成一张可以随时调用的“思维地图”。
它特别适合两类人:一是正在冲刺408计算机统考,对这部分内容感觉模糊的同学;二是任何需要快速回顾计算机底层数据表示的程序员。最关键的不是图本身,而是这张图背后梳理出的判断流程和边界条件——比如,给你一个数,怎么快速写出它的各种码制?加减运算时到底用哪种码?溢出怎么判?这些才是考试和实践中真正要用的东西。
下面我就围绕“一图流”这个核心,结合408真题的考察风格,把这块内容拆解成可复现的理解和解题步骤。
1. 先搞明白“一图流”到底想解决什么痛点
在深入细节之前,我们得先统一目标:为什么需要“一图流”?直接看书上的定义不行吗?
问题就在于,书上的定义往往是孤立的。比如,教材会分别告诉你:
- 原码:最高位是符号位,0正1负,其余位表示绝对值。
- 反码:正数反码是其本身;负数反码是符号位不变,其余位按位取反。
- 补码:正数补码是其本身;负数补码是反码加1。
单独看每一条都很清晰。但当你面对一道真题,比如“已知[X]补 = 11011001,求X的真值”或者“8位补码表示范围是多少?”时,你需要的是一连串的条件判断和操作。如果知识点是散的,你就需要在大脑里临时组装这个流程,容易出错。
“一图流”的本质,就是把这个判断和操作流程固化下来。它应该能回答以下问题,这也是408常见的出题角度:
- 给定一个真值(尤其是负数),如何得到它的原、反、补码?(编码过程)
- 给定一个机器数(原、反、补码形式),如何求出它的真值?(解码过程)
- 进行加减运算时,为什么用补码?具体的运算规则是什么?
- 如何判断补码加减运算的结果是否溢出?
- 原码、反码、补码各自的表示范围是多少?(特别是负数范围)
所以,在画图或看图之前,心里要装着这几个问题。一张好的“一图流”,应该是解决这些问题的决策流程图或对比总结表。
2. 构建你自己的核心“一图流”:从真值到机器数
我不直接给你一张现成的、可能看不懂的复杂图,而是带你一步步推导出关键部分。你可以把这个推导过程记录在笔记的醒目位置。
2.1 核心关系推导(以负数为例)
这是所有运算的基础。我们假设用8位二进制表示一个数。
已知:真值X = -5求:[X]原,[X]反,[X]补
步骤:
原码:符号位为1(负),数值位为绝对值的二进制。
5的二进制是0000101。- 所以
[X]原 = 1 0000101(符号位与数值位之间加空格以便观察)。
反码:负数反码 = 原码符号位不变,数值位按位取反。
- 数值位
0000101取反为1111010。 - 所以
[X]反 = 1 1111010。
- 数值位
补码:负数补码 = 反码 + 1。注意,这个加1是二进制加法,只加在数值位,符号位不参与此次运算。
1 1111010的数值位1111010加1。1111010 + 1 = 1111011。- 所以
[X]补 = 1 1111011。
重要观察:
- 负数的补码,也可以直接从原码得到:“符号位不变,数值位从右向左找到第一个1,这个1及其右边的位保持不变,左边的位按位取反”。对于
-5(原码1 0000101),从右向左第一个1在最右边,所以只保留那个1,左边所有位取反,得到1 1111011。这个方法有时更快。 [X]补再求一次补码(即[[X]补]补),就得到[X]原。这是补码的一个重要性质。
你可以把这个推导过程,用下面的流程图表示,这就是你“一图流”的第一部分:
给定负数真值 X | v 写出其绝对值的二进制形式 | v 前面加上符号位1,得到 [X]原 | v 符号位1不变,数值位取反,得到 [X]反 | v [X]反 的数值位 +1,得到 [X]补2.2 表示范围与特殊值
这是选择题和填空题的高频考点。必须熟记。
| 码制 | 8位二进制表示范围 | 解释 | 特殊值(8位) |
|---|---|---|---|
| 原码 | -(2⁷-1) 到 +(2⁷-1) 即-127 到 +127 | 0有+0(00000000) 和-0(10000000) 两种表示 | 10000000表示 -0 |
| 反码 | -(2⁷-1) 到 +(2⁷-1) 即-127 到 +127 | 0有+0(00000000) 和-0(11111111) 两种表示 | 11111111表示 -0 |
| 补码 | -2⁷ 到 +(2⁷-1) 即-128 到 +127 | 0的唯一表示是 00000000,10000000被定义为 -128 | 10000000表示-128 |
为什么补码范围能多表示一个数?因为补码中10000000这个在原码和反码中表示-0的编码,被赋予了新的含义-128。但注意,-128没有原码和反码(8位下)。-128的补码就是10000000,对其求补码(数值位取反加1)会发现无法得到对应的原码,这是一个特例,记住即可。
这部分总结表,是你“一图流”的第二部分。
3. 补码的运算与溢出判断:真题的核心
408考察原码、反码、补码,绝大部分最终都落在补码的运算和溢出判断上。因为现代计算机统一使用补码进行整数加减运算。
3.1 补码加减运算规则
规则很简单,但容易在细节上出错:
- 加法:
[X+Y]补 = [X]补 + [Y]补(mod 2ⁿ)。直接拿两个补码二进制数做加法,包括符号位一起参与运算!超出n位的进位直接丢弃。 - 减法:
[X-Y]补 = [X]补 + [-Y]补。将减法转化为加法,其中[-Y]补等于[Y]补的所有位(包括符号位)按位取反,然后末位加1(即求补操作)。
实操要点:做计算时,一定要把两个数的补码写出来,对齐位数,然后做二进制加法。例如,用8位补码计算65 - 68。
[65]补 = 01000001[68]补 = 01000100- 求
[-68]补:[68]补01000100所有位取反得10111011,再加1得10111100。 - 计算
[65]补 + [-68]补:01000001 + 10111100 ----------- 11111101 (最高位进位1丢弃) - 结果
11111101是一个补码,求真值:符号位为1是负数。数值位1111101减1得1111100,再取反得0000011,即3。所以结果是-3。
3.2 溢出判断:两种必须掌握的方法
这是大题和难题的关键。运算结果超出了补码所能表示的范围,就会发生溢出。溢出只发生在两个同号数相加,或者两个异号数相减(转化为同号数相加)时。
方法一:双符号位判断法(常用,推荐)将操作数符号位扩展一位,用两位表示符号:00表示正,11表示负。
- 运算后,结果的两位符号位如果相同(
00或11),则未溢出。 - 如果两位符号位不同(
01或10),则溢出。01:正溢出(两个正数相加结果太大,变成负数表象)。10:负溢出(两个负数相加结果太小,变成正数表象)。
示例:用8位补码(我们扩展到9位看符号)计算120 + 10。
[120]补 = 00 1111000(扩展后)[10]补 = 00 0001010- 相加得
01 0000010。 - 结果的符号位为
01,不同,且为01,故发生正溢出。
方法二:单符号位结合进位判断设Cs为符号位产生的进位,Cp为最高数值位(符号位后一位)向符号位的进位。
- 溢出标志
OF = Cs ⊕ Cp(异或)。 - 若
OF = 1,则溢出;OF = 0,则未溢出。
这个方法来自ALU运算器的内部逻辑,理解即可,做题时双符号位法更直观可靠。
“一图流”中,这部分应该是一个决策分支:
进行补码加法后 | v 检查结果的双符号位 / \ 00或11 01或10 | | 无溢出 发生溢出 / \ 01 10 | | 正溢出 负溢出4. 真题实战与“一图流”应用
现在,我们拿着构建好的“一图流”思维,去拆解几类典型题目。这才是笔记的最终目的。
4.1 题型一:码制转换(基础题)
题目:设机器数字长为8位(含1位符号位),若A=+15,B=+24,求[A-B]补。
解题流程(对应“一图流”编码和运算部分):
- 确定真值:
A-B = 15 - 24 = -9。 - 求[-9]补:
- 方法A(通过原码、反码):
+9的原码:0 0001001-9的原码:1 0001001-9的反码:1 1110110-9的补码:1 1110110 + 1 = 1 1110111
- 方法B(快速法):
+9的二进制:0001001- 从右向左找到第一个1(最右边),这个1和右边的0保持不变,左边取反:左边
0001取反为1110,保留0111,得到1110111。 - 加上符号位1:
1 1110111。
- 方法A(通过原码、反码):
- 答案:
[A-B]补 = 11110111
避坑点:如果题目直接给[A]补和[B]补,要求[A-B]补,一定要先写出[-B]补,再做加法,而不是直接用[A]补减去[B]补。
4.2 题型二:溢出判断(综合题)
题目:用8位补码计算(-83) + (-42),并判断是否溢出。
解题流程(对应“一图流”运算和溢出部分):
- 求补码:
[-83]补:83二进制为01010011,原码1 1010011,快速法得补码1 0101101。[-42]补:42二进制为00101010,原码1 0101010,快速法得补码1 1010110。- 验证:可以互相求补验证。
1 0101101取反加1得1 1010011,即-83的原码,正确。
- 计算加法(使用双符号位法):
- 扩展符号位:
[-83]补 = 11 0101101,[-42]补 = 11 1010110。 - 相加:
11 0101101 + 11 1010110 ------------- 111 0000011 (最高位进位1丢弃) - 结果的双符号位是
11(看结果的前两位11)。
- 扩展符号位:
- 判断:双符号位为
11,相同,未溢出。 - 求真值(验证):结果补码为
1 0000011(单符号位)。这是一个负数,数值位0000011减1得0000010,取反得1111101,即125。所以结果是-125。-83 + (-42) = -125,在8位补码范围(-128~127)内,确实未溢出。
4.3 题型三:综合分析与设计(大题)
这类题可能要求你设计一个判断电路,或者分析一段代码的结果。核心依然是“一图流”里的概念。
核心思路:
- 明确码制:题目给定的数是原码、补码还是移码?运算采用什么码?
- 确定操作:是加法、减法还是比较?
- 分情况讨论:特别是涉及负数、溢出、边界值(如-128)时。
- 利用性质:
[X]补与[-X]补的关系,补码的算术移位规则等。
5. 复习建议与常见误区
最后,结合“一图流”笔记,给你几点落地建议:
1. 笔记不要只画图,要配套典型例题。在你的“一图流”旁边,一定要贴上1-2道经典的、涵盖不同考点的真题。比如,一道码制转换,一道溢出计算。每次复习时,先看图回忆流程,然后独立做一遍例题。
2. 重视“-128”这个特殊值。这是补码独有的,也是选择题常设的陷阱。记住8位补码10000000表示-128,它没有原码和反码。遇到涉及它的运算要格外小心。
3. 运算时符号位一定要参与。这是新手最容易错的地方。补码运算时,符号位就是数值的一部分,一起加、一起移位。不要单独把符号位拎出来处理。
4. 溢出判断只关注同号数相加。异号数相加,结果绝对值只会变小,永远不会溢出。所以看到题目先看操作数符号,能快速排除一些选项。
5. 善用“求补”操作进行减法。[X-Y]补 = [X]补 + [-Y]补,其中[-Y]补等于对[Y]补连同符号位一起取反加1。这个“求补”操作(注意与“补码”概念区分)是必须熟练掌握的单一动作。
真正有效的“一图流”,是你自己动手画过、推导过、并且用它成功解出过几道难题之后,内化在脑子里的那个判断体系。它不应该是一张需要死记硬背的图,而应该是一套条件反射——看到题目,就能自动触发正确的处理路径。按照上面的步骤,从关系推导到范围记忆,再到运算和溢出判断,最后用真题巩固,把这个流程走通,这块知识点就很难再丢分了。