This is what I see in java, and it puzzles me.
Long.toHexString(0xFFFFFFFF)
returns ffffffffffffffff
Similarly, 0xFFFFFFFF
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)
0xFFFFFFFF
is an int
literal. When using int
s (32 bit in Java) 0xFFFFFFFF
equals -1
. What your code does:
0xFFFFFFFF
as an int
with value -1
Long.toHexString(-1)
(the -1
get "casted" automatically to a long
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"
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)
.
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].