Дело в том, что и float, и int представлены 32-битными значениями. Целочисленное значение использует все 32 бита, поэтому оно может содержать числа от -2 31 до 2 31 -1. Однако число с плавающей запятой использует 1 бит для знака (включая -0.0f) и 8 бит для показателя степени. Средство 32 - 9 = 23 бита осталось для мантиссы. Однако число с плавающей точкой предполагает, что если мантисса и показатель степени не равны нулю, тогда мантисса начинается с 1. Таким образом, у вас более или менее есть 24 бита для целого числа вместо 32. Однако, поскольку оно может быть смещено, оно вмещает больше чем 2 24 целых чисел.
A floating point uses a Sign, an eXponent, and a Mantissa
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
An integer has a Sign, and a Mantissa
S M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M
Итак, целое число, такое как:
1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
помещается в число с плавающей точкой, потому что его можно сместить:
1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
| | |
| +---------+ +---------+
| | |
v v v
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
Я не показываю вам eXponent, потому что я чаще всего ошибаюсь при его вычислении, но это должно быть что-то вроде 5 (или -5?), Потому что я сдвинулся на 5 бит (но вы должны добавить или вычесть 128) ...). Это ясно показывает, что если вам нужно сдвинуться на 5 битов, вы потеряете 5 младших битов.
Таким образом, это другое целое число может быть преобразовано в число с плавающей запятой с потерей 2 бит (т. Е. При обратном преобразовании в целое число последние два бита (11) устанавливаются в ноль (00), поскольку они не были сохранены в плавать):
1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1
| | | | | | | |
| +---------+ +---------+ +-+-+-+-+--> all lost
| | |
v v v
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
Довольно простые вещи на самом деле.
ВАЖНОЕ ПРИМЕЧАНИЕ: Да, первая 1 в целом числе является знаком, затем следующая 1 не копируется в мантиссу, предполагается, что это 1, поэтому это не требуется.