对负运算数签名的右移运算符

问题描述:

我正在阅读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)?

所得值是floor(n/2s)

Floor意味着下降:向负无穷大转。这与截断不同,即去除小数部分。截断会导致正数减少,负数累加。

-12.5的地板是-13。

Demo.

+0

但是,如果您的电话号码> n.5,那么结果将变为四舍五入。试用-77/8。其结果是-9.625,编译器返回-10!不是-9! – xdevel2000

+1

@xdevel -10低于-9.625,这是怎么回事? – Ingo

+0

该死的。你是对的。对不起! – xdevel2000

一般来说Java不采用四舍五入的系统的话,那只是转移一些位。如果需要floorceil,则使用floorceil,并在需要时使用位移运算符。