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

时间:2014-02-28 15:03:34

标签: 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));
    }
}

输出结果为:

1111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111

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

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

1 个答案:

答案 0 :(得分:7)

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

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