补码数乘2时的溢出检测:需检查哪些位?
n位补码数乘2的溢出判断:最少检查位数及具体位
核心结论
判断n位补码有符号数乘以2是否溢出,只需要检查最高两位(符号位和次高位),也就是最少检查2位。
原理说明
补码中,乘以2等价于算术左移一位,溢出的本质是结果超出n位补码的表示范围[-2^(n-1), 2^(n-1)-1],通过最高两位的关系就能直接判断:
- 若符号位(第n位,从1开始计数)与次高位(第n-1位)相同:
- 正数(符号位为0):原数最大为
2^(n-2)-1,乘2后结果为2^(n-1)-2,未超过正数上限2^(n-1)-1,无溢出。 - 负数(符号位为1):原数范围是
[-2^(n-1), -2^(n-2)],乘2后结果落在[-2^n, -2^(n-1)],其中-2^(n-1)是n位补码的合法最小值,其余结果也在表示范围内,无溢出。
- 正数(符号位为0):原数最大为
- 若符号位与次高位不同:
- 正数(符号位0、次高位1):原数最小为
2^(n-2),乘2后结果为2^(n-1),超出正数上限2^(n-1)-1,溢出。 - 负数(符号位1、次高位0):原数范围是
[-2^(n-1)+1, -2^(n-2)-1],乘2后结果小于n位补码最小值-2^(n-1),溢出。
- 正数(符号位0、次高位1):原数最小为
示例验证(以4位补码为例,范围[-8,7])
0100(十进制4):符号位0、次高位1 → 乘2得8,超出范围,溢出。1011(十进制-5):符号位1、次高位0 → 乘2得-10,超出范围,溢出。0011(十进制3):符号位0、次高位0 → 乘2得6,合法无溢出。1100(十进制-4):符号位1、次高位1 → 乘2得-8,合法无溢出。
内容的提问来源于stack exchange,提问作者Ranar 100
相关产品推荐
相关产品推荐

