Чтобы добавить что-то к тому, что написал Mysticial (это правильно): ваша реализация C использует float
, которые 32 бита, двоичные числа с плавающей точкой одинарной точности IEEE 754 и int
, которые являются 32 битами,В «вашем» int
вы можете иметь 31 бит числа и 1 бит знака.В «вашем» float значение mantissa
составляет 24 бита и 1 бит знака.Ясно, что int
s, для представления которых требуется более 24 бит плюс знак, не может быть точно преобразовано в "ваше" float
.(Я использую «your» для представления «вашего» компилятора, компилятора, который вы используете. Стандарт C не указывает точную длину float
или int
).
Теперь, rand()
может генерировать любое число int
, поэтому компилятор должен предупредить вас.100
- это числовой литерал, который известен во время компиляции, поэтому компилятор может статически проверить, может ли это число быть конвертируемым.
(даже без точного объяснения того, как работают числа с плавающей запятой, ваш int
равен 32 битам).и «поддерживает» только целые числа. Ваш float
является 32-битным и «поддерживает» числа с плавающей запятой. Ясно, что числа с плавающей запятой труднее представить (вы должны сохранить где-нибудь, где находится десятичная точка), поэтому должен быть«цена», которую вы платите, если оба значения int
и float
имеют одинаковую длину. Цена является точной.)
Чтобы ответить на сделанный вами комментарий, максимальное число, которое вы можете представить точно в float
то есть "смежно" с 0 (так что 0 ... число все точно представимо) - это 16777215 (у которого есть мантисса = 16777215 и экспонента = 0) и 16777216 (у которого есть мантисса = 1 и экспонента = 24, потому что это 1* 2 ^ 24).16777217 точно не представлен.16777218 is.