为什么 toHexString 的长度可变?

为什么 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

PS 为什么oracle或tutorialspoint没有说明方法是如何实现的?在哪里可以找到标准库的实现?


FFIVE
浏览 167回答 1
1回答

喵喵时光机

这与toHexString方法无关,它int与longJava 中的vs以及有符号整数的二进制表示有关。当你写long b = 0x7FFFFFFF;和long b = 0x80000000;右边的文字数字被解释为int(32 位)。现在,在第二种情况下,值溢出(有符号)整数正范围,其二进制表示1在最左边的位置有一个,因此该数字被理解为负数 (-2147483648)。之后,在赋值中,它被提升为(负)长,因此额外的 32 位填充为 1。这就是为什么你会看到那些“额外的”FFF...如果您不了解 Java 中带符号整数的二进制表示,请阅读此处
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java