为什么移位算子中负数的结果与正常除法不同?

问题描述 投票:1回答:2

我试图理解移位运算符的概念,我正在测试以下代码:

15 >> 2;    
- 15 >> 2 

第一个语句的结果是3为15/4 = 3,但第二个语句的结果是-4。

我知道-15的二进制数是11110001,当我们向右移动2时,我们有11111100,这是-4。但是我并不感到不安,为什么结果不同于-15 / 4 = -3而不是-4的简单除法?

请指导我为什么会这样?

java bit-shift
2个回答
2
投票

移位运算符通过取底而不是截断来丢弃任何数学分数。 JLS, Section 15.19,指出:

n >> s的值是带有符号扩展的n右移s位位置。结果值是floor(n / 2s)。对于n的非负值,这相当于将由整数除法运算符/计算的整数除法截断为幂s的2。

-3.75的地板是-4,而截断将产生-3

当值右移时,位会在值“偏离结束”时丢失。这是负责地板操作的原因。

-15: 11110001
 -4: 11111100 // The rightmost 1 bit above is lost, resulting in what looks like the floor function.

0
投票

Java使用two's complement来表示负数。 在二进制补码二进制数上向右移位n位具有将其除以2n的效果,但它总是向下舍入(朝向负无穷大)。这与通常在有符号整数除法(向0舍入)中进行舍入的方式不同。

© www.soinside.com 2019 - 2024. All rights reserved.