为什么在看起来非常特殊的情况下toHexString打印不同的字符串?打印低于0x80000000的数字可以正常工作。给该值加1并打印就可以了。但是,直接分配该值不会显示相同的内容,相反,我必须在末尾添加一个L。
我的猜测是,它与数字文字默认情况下为int类型有关,但我不知道这种情况发生在0x80000000处,而不是发生在例如越过0xffffffff时。
long a = 0x7FFFFFFF;
System.out.println(java.lang.Long.toHexString(a)); // prints 7fffffff
a++;
System.out.println(java.lang.Long.toHexString(a)); // prints 80000000
long b = 0x80000000;
System.out.println(java.lang.Long.toHexString(b)); // prints ffffffff80000000
b=0x80000000L;
system.out.println(java.lang.Long.toHexString(b)); // prints 80000000
P.S。为什么oracle或tutorialspoint没有说出方法的实现方式?在哪里可以找到标准库的实现?
答案 0 :(得分:1)
这与toHexString
方法无关,这与Java中的int
和long
以及带符号整数的二进制表示有关。
撰写时
long b = 0x7FFFFFFF;
和
long b = 0x80000000;
右侧的文字数字被解释为int
(32位)。现在,在第二种情况下,值超出了(有符号的)整数正范围,其二进制表示在最左边的位置具有1
,因此该数字被理解为负(-2147483648)。之后,在分配中,它被提升为(负)长,因此多余的32位填充为1。这就是为什么您看到那些“额外” FFF...
如果您不知道Java中带符号整数的二进制表示形式,请read here