2016-12-16 60 views
2

我正在閱讀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)?

回答

8

所得值是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

1

一般來說Java不採用四捨五入的系統的話,那只是轉移一些位。如果需要floorceil,則使用floorceil,並在需要時使用位移運算符。