java - 为什么 toHexString 的长度可变?

标签 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

附注为什么不oracletutorialspoint说说方法是如何实现的?在哪里可以找到标准库的实现?

最佳答案

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

当你写

长b = 0x7FFFFFFF;

长b = 0x80000000;

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

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

关于java - 为什么 toHexString 的长度可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52799637/

相关文章:

java - 从字符串转换为整数

c++ - 比较两个 C++ 十六进制字符串

javascript - 查找由 rgba 颜色创建的十六进制颜色

java - NEO4j 密码查询匹配相同的单词

java - 如何获取android中特定区域的坐标?

csv - 将大量 .csv 文件转换为 SPSS 文件

c - 显示带前导零的十六进制整数

java - 检查 Java 定时器是否被取消

java - 确定字符串是否有内部单词边界

javascript - 如何在 typescript 中使用外部js