1. 补码表示基础与整数溢出原理
计算机组成原理中,补码表示法是整数存储的核心机制。2010年408考研真题第13题正是考察这个基础但易错的知识点。补码的本质是将符号位参与运算,使得加减法可以统一处理。以8位二进制为例,补码表示范围是-128(10000000)到+127(01111111)。
整数溢出发生在算术运算结果超出数据类型表示范围时。例如两个正数相加结果超过127,最高位进位到符号位,导致结果变为负数。这种异常在底层硬件中不会主动报错,需要程序员自行判断。典型的溢出检测方法是观察运算前后符号位变化:正+正得负,或负+负得正则必定溢出。
关键细节:补码表示中0是唯一的(00000000),而原码中存在+0和-0两种表示。这也是补码被广泛采用的原因之一。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 2010年真题深度解析
原题给出四个选项,要求判断哪种情况会发生溢出。我们还原题目条件并逐项分析:
2.1 选项A:两个正数相加
当两个补码表示的正数相加,结果超出127时,符号位会被进位改变。例如126(01111110)+3(00000011)=129,但实际存储为10000001(即-127)。这是典型的正向溢出案例。
2.2 选项B:正数与负数相加
这种情况不会溢出。因为正负相抵,结果绝对值一定不大于原数绝对值。例如120(01111000)+(-10)(11110110)=110(实际结果为01101110)。符号位由较大绝对值数的符号决定。
2.3 选项C:负数与负数相加
类似于选项A的反向情况。例如-126(10000010)+(-5)(11111011)=-131,但实际存储为01111101(+125)。符号位从1变为0表明负向溢出。
2.4 选项D:正数减负数
这实质上是正数加正数,等同于选项A的情况。例如100-(-30)实际是100+30,同样存在溢出风险。
3. 溢出检测的硬件实现
现代CPU通常通过状态寄存器中的溢出标志位(Overflow Flag)来检测异常。其实现原理基于以下逻辑电路:
- 最高有效位(MSB)进位:记录符号位向更高位的进位情况
- 次高有效位进位:记录数值最高位向符号位的进位
- 异或门判断:当两个进位信号不同时置位溢出标志
具体到x86架构,JO(溢出跳转)和JNO
