Hanno Fietz Hanno Fietz - 23 days ago 7
Java Question

How do I compare two longs as unsigned in Java?

I'm storing bit patterns of unsigned 64-bit numbers in a

long
variable and want to calculate the distance between two of them on the unsigned range. Because Java interprets
long
as a two's complement signed integer, I can't just do
a - b
, as the following example shows:

// on the unsigned range, these numbers would be adjacent
long a = 0x7fffffffffffffffL;
long b = 0x8000000000000000L;

// but as two's complement (or any representation that
// stores the sign in the first bit), they aren't
assert b - a == 1;


What's the correct way to do this?

Answer

If you're dealing with addition and subtraction, it doesn't matter whether you're using signed or unsigned types, as long as the arguments are both signed or both unsigned. If you need to compare a and b, compare a-b to 0.