负操作数上的右移运算符

时间:2016-12-16 14:32:55

标签: java

我正在阅读Java规范。这里写着:

  

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

所以,如果我有以下内容:

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 个答案:

答案 0 :(得分:8)

  

结果值为floor(n / 2s)

Floor 表示向下舍入:向负无穷大舍入。这与截断不同,即去除分数部分。截断会导致正数向下舍入,而负数则向上舍入。

-12.5的最低值是-13。

Demo.

答案 1 :(得分:1)

一般来说,Java根本不使用舍入系统,它只是移位了一些位。如果您需要floorceil,请使用floorceil,并在需要时使用位移运算符。