按位移位中的舍入问题:向负无穷与向零舍入的差异及示例
补码右移的舍入逻辑:向负无穷 vs 向零舍入
嘿,咱们把这两种舍入方式掰扯清楚,结合补码右移的场景来理解就容易多了:
1. 两种舍入方式的核心含义
向零舍入(Truncation towards zero)
简单说就是「砍去小数部分,不管正负都往0靠」:
- 正数:直接去掉小数,比如
5.8 → 5,3.1 → 3 - 负数:同样去掉小数,但结果会比原数更接近0(绝对值变小),比如
-5.8 → -5,-3.1 → -3
向负无穷舍入(Truncation towards negative infinity)
这个是「往更小的整数方向走」,不管正负都找比原数小的那个整数:
- 正数:和向零舍入结果一样,比如
5.8 → 5,3.1 → 3(因为5比5.8小,是最接近负无穷的整数) - 负数:会找比原数更小的整数(绝对值更大),比如
-5.8 → -6,-3.1 → -4(因为-6比-5.8小,更靠近负无穷)
2. 二者的关键差异
差异只体现在负数不能被整除的场景:
- 正数:两种舍入结果完全一致
- 负数:向零舍入是「凑零」,向负无穷舍入是「凑更小的数」
3. 结合补码右移的实际示例
补码右移n位,本质就是对有符号数做「除以2ⁿ并向负无穷舍入」,和常规有符号整数除法的「向零舍入」形成对比,咱们用8位补码举例:
示例1:正数(无差异)
十进制 8 的8位补码是 00001000:
- 右移1位:
00000100→ 十进制4 - 常规除法(向零舍入):
8 ÷ 2 = 4,结果完全一致
示例2:负数(有差异)
十进制 -5 的8位补码是 11111011:
- 补码右移1位:符号位保持1,右移后得到
11111101→ 十进制-3(对应-5 ÷ 2 = -2.5,向负无穷舍入到-3) - 常规除法(向零舍入):
-5 ÷ 2 = -2(直接砍去小数部分,向零靠拢)
再看一个更明显的例子:十进制 -7 的8位补码是 11111001:
- 补码右移1位:
11111100→ 十进制-4(对应-7 ÷ 2 = -3.5,向负无穷舍入到-4) - 常规除法(向零舍入):
-7 ÷ 2 = -3
内容的提问来源于stack exchange,提问作者LearningMath




