A long
занимает 64 бита, int
занимает 32 бита. Когда вы преобразуете long
в int
, старшие 32 бита будут отброшены, а младшие 32 бита будут сохранены как int
. Например:
Long sourceLong = Long.MAX_VALUE; // in binary 0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
int i = sourceLong.intValue(); // in binary 1111 1111 1111 1111 1111 1111 1111 1111
System.out.println(i); // decimal -1
Long copyLong = Long.valueOf(i);
System.out.println(sourceLong.equals(copyLong)); //false
Таким образом, вы не можете преобразовать это int
обратно в начало long
, так как старшие 32 бита потеряны.
Один особый случай, когда старший 33-битный бит long
равен нулю, он не теряет никакой точности, даже если старший 32-битный отброшен:
Long sourceLong = 1L; // in binary 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
int i = sourceLong.intValue(); // in binary 0000 0000 0000 0000 0000 0000 0000 0001
System.out.println(i); // decimal 1
Long copyLong = Long.valueOf(i);
System.out.println(sourceLong.equals(copyLong)); //true
Подобная процедура происходит, когда вы конвертируете int
в short(16 bit)
, в char(16 bit)
, в byte(16 bit)
.