为什么Long.toHexString(0xFFFFFFFF)返回ffffffffffffffff

时间:2012-01-30 14:50:29

标签: java twos-complement

这就是我在java中看到的,它让我很困惑。

Long.toHexString(0xFFFFFFFF)返回ffffffffffffffff

同样,0xFFFFFFFFLong.parseLong("FFFFFFFF", 16)不相等。

4 个答案:

答案 0 :(得分:9)

此:

Long.toHexString(0xFFFFFFFF)

相当于:

Long.toHexString(-1)

相当于:

Long.toHexString(0xFFFFFFFFFFFFFFFFL)

基本上,问题在于您指定了负int值,然后将其转换为等效的负 long 值,该值由“所有F”组成。如果你真的想要 8 Fs,你应该使用:

Long.toHexString(0xFFFFFFFFL)

答案 1 :(得分:7)

正如其他人所说,0xFFFFFFFF评估为 int -1,该值已提升为long

要获得您期望的结果,请使用L后缀限定常量,以表明它应被视为long,即Long.toHexString(0xFFFFFFFFL)

答案 2 :(得分:2)

当然,java中的Long长度为64位! 0xFFFFFFFF表示-1int,当以64位写入时,ffffffffffffffff

但是,如果数字是无符号的,那么字符串也是ffffffff [但是java中没有unsigned

答案 3 :(得分:1)

0xFFFFFFFF是一个int字面值。使用int时(Java中为32位)0xFFFFFFFF等于-1。你的代码做了什么:

  • 编译器将0xFFFFFFFF解析为int,其值为-1
  • java运行时调用Long.toHexString(-1)-1得到“自动”转换为long,这是预期的。

使用long时(Java中为64位)-10xffffffffffffffff

long文字由L后固定。因此,您的预期行为是用Java编写的:

Long.toHexString(0xFFFFFFFFL)

Long.toHexString(0xFFFFFFFFL)"ffffffff"