为什么java.lang.Long(MAX_VALUE)中只有63位?

Spa*_*ter 1 java binary max long-integer

谁能解释下面两个println语句的输出之间的区别?

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

1111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

第一行输出包含64位二进制数字.第二行仅包含63个二进制数字.

如果0xffff_ffff_ffff_ffffL大于Long.MAX_VALUE,我会发现编译器错误.但程序显然会编译,因此输出的差异必然是由于某些其他原因.

Bri*_*ish 7

由于Long已签名,因此使用一位来存储符号.Long.MAX_VALUE因此是2 ^ 63 - 1.

请参阅此处的文档:http: //docs.oracle.com/javase/7/docs/api/java/lang/Long.html