2014-02-28 105 views
1

誰能解釋從以下兩個println語句輸出之間的差別?爲什麼java.lang.Long中只有63位(MAX_VALUE)?

public class LongTest { 
    public static void main(String[] args) { 
     System.out.println(Long.toBinaryString(0xffff_ffff_ffff_ffffL)); 
     System.out.println(java.lang.Long.toBinaryString(Long.MAX_VALUE)); 
    } 
} 

的輸出是:

1111111111111111111111111111111111111111111111111111111111111111 
111111111111111111111111111111111111111111111111111111111111111 

輸出的第一行包含64組二進制數位。第二行只包含63個二進制數字。

如果如果0xffff_ffff_ffff_ffffL比Long.MAX_VALUE是更大的,我希望編譯錯誤。但是這個程序顯然是編譯的,所以輸出的差異必定是由於其他原因。

+7

可能是一個64位的值,但是1位用於符號,所以你effectly有範圍63位。 –

+2

大概【二補](http://en.wikipedia.org/wiki/Two%27s_complement),而第一位爲符號位。 –

+0

'Long.MAX_VALUE'是'0x7fffffffffffffffL'。 – arshajii

回答

7

長久以來的簽署,一個位用於存儲符號。因此Long.MAX_VALUE爲2^63 - 1。

查看文檔在這裏: http://docs.oracle.com/javase/7/docs/api/java/lang/Long.html

+1

是的,就是這樣。作爲十進制數0xffff_ffff_ffff_ffff = -1。 –

+1

在我之前的評論中輸入錯字。數值字面應L.結束 –

相關問題