负操作数上的有符号右移运算符

3

我正在阅读Java规范,其中写道:

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

因此,如果我有以下内容:

27 >> 3 // 00011011 >> 3 = 00000011 = 3 = 27/8

结果是 3;实际上 27/8 = 3.375,因此 3 是被截断的值。

但是规范在左操作数为负数时没有说明任何内容。

所以如果我有以下内容:

-50 >> 2 // 11001110 >> 2 = 11110011 = -13 != -50/4

结果是-13,但是-50/4=-12.5,因此-13不是那个被截断的值。
当左操作数为负值时,Java使用什么舍入系统呢?
也许是ceil(n / 2s)
2个回答

8

结果值为floor(n / 2s)

Floor表示向下取整:向负无穷大方向取整。这与截断不同,即删除小数部分。截断会导致正数向下舍入,负数向上舍入。

-12.5的底数是-13。

演示。


但是,如果您的数字> n.5,则结果将四舍五入。尝试使用-77/8。其结果为-9.625,编译器返回-10!而不是-9! - xdevel2000
1
@xdevel,-10比-9.625小,那么它会如何四舍五入? - Ingo

1
一般来说,Java 并不使用任何舍入系统,它只是移动一些位。如果需要 floor 或 ceil,则应使用 floor 或 ceil,并在需要时使用位移操作符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接