You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

按位移位中的舍入问题:向负无穷与向零舍入的差异及示例

补码右移的舍入逻辑:向负无穷 vs 向零舍入

嘿,咱们把这两种舍入方式掰扯清楚,结合补码右移的场景来理解就容易多了:

1. 两种舍入方式的核心含义

向零舍入(Truncation towards zero)

简单说就是「砍去小数部分,不管正负都往0靠」:

  • 正数:直接去掉小数,比如 5.8 → 53.1 → 3
  • 负数:同样去掉小数,但结果会比原数更接近0(绝对值变小),比如 -5.8 → -5-3.1 → -3

向负无穷舍入(Truncation towards negative infinity)

这个是「往更小的整数方向走」,不管正负都找比原数小的那个整数:

  • 正数:和向零舍入结果一样,比如 5.8 → 53.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

火山引擎 最新活动