问题
This is what I see in java, and it puzzles me.
Long.toHexString(0xFFFFFFFF)
returns ffffffffffffffff
Similarly, 0xFFFFFFFF
and Long.parseLong("FFFFFFFF", 16)
are unequal.
回答1:
As others have said, 0xFFFFFFFF
evaluates to the int value -1
, which is promoted to a long
.
To get the result you were expecting, qualify the constant with the L
suffix to indicate it should be treated as a long
, i.e. Long.toHexString(0xFFFFFFFFL)
.
回答2:
This:
Long.toHexString(0xFFFFFFFF)
is equivalent to:
Long.toHexString(-1)
which is equivalent to:
Long.toHexString(0xFFFFFFFFFFFFFFFFL)
Basically, the problem is that you're specifying a negative int
value, which is then being converted to the equivalent negative long value, which consists of "all Fs". If you really want 8 Fs, you should use:
Long.toHexString(0xFFFFFFFFL)
回答3:
Of course, Long
in java is 64-bits long! 0xFFFFFFFF
means -1
as an int
, when written in 64 bits, it's ffffffffffffffff
.
However, if the number were unsigned, the string would also be ffffffff
[but there's no unsigned
in java].
回答4:
0xFFFFFFFF
is an int
literal. When using int
s (32 bit in Java) 0xFFFFFFFF
equals -1
. What your code does:
- the compiler parses
0xFFFFFFFF
as anint
with value-1
- the java runtime calls
Long.toHexString(-1)
(the-1
get "casted" automatically to along
which is expected here)
And when using long
s (64 bit in Java) -1
is 0xffffffffffffffff
.
long
literals are post-fixed by an L
. So your expected behaviour is written in Java as:
Long.toHexString(0xFFFFFFFFL)
and Long.toHexString(0xFFFFFFFFL)
is "ffffffff"
来源:https://stackoverflow.com/questions/9065727/why-long-tohexstring0xffffffff-returns-ffffffffffffffff