为什么toHexString具有可变长度?

时间:2018-10-14 05:05:09

标签: java type-conversion hex

为什么在看起来非常特殊的情况下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。为什么oracletutorialspoint没有说出方法的实现方式?在哪里可以找到标准库的实现?

1 个答案:

答案 0 :(得分:1)

这与toHexString方法无关,这与Java中的intlong以及带符号整数的二进制表示有关。

撰写时

long b = 0x7FFFFFFF;

long b = 0x80000000;

右侧的文字数字被解释为int(32位)。现在,在第二种情况下,值超出了(有符号的)整数正范围,其二进制表示在最左边的位置具有1,因此该数字被理解为负(-2147483648)。之后,在分配中,它被提升为(负)长,因此多余的32位填充为1。这就是为什么您看到那些“额外” FFF...

如果您不知道Java中带符号整数的二进制表示形式,请read here