This is what happens with signed integer overflow, basically.
It's simpler to take byte
as an example. A byte
value is always in the range -128 to 127 (inclusive). So if you have a value of 127
(which is 0x7f) if you add 1, you get -128. That's also what you get if you cast 128 (0x80) to byte
:
int x = 0x80; // 128
byte y = (byte) x; // -128
Overflow (in 2s complement integer representations) always goes from the highest expressible number to the lowest one.
For unsigned types, the highest value overflows to 0 (which is again the lowest expressible number). This is harder to show in Java as the only unsigned type is char
:
char x = (char) 0xffff;
x++;
System.out.println((int) x); // 0