Я полагаю, что наибольшее целочисленное значение, которое может содержать 32-разрядное число с плавающей запятой IEEE, равно 1048576, что меньше числа, указанного выше. Таким образом, определенно верно, что значение с плавающей запятой не будет содержать точно 16777217.
Часть, в которой я не уверен, заключается в том, как компилятор сравнивает два разных типа чисел (то есть, число с плавающей точкой и целое число). Я могу придумать три разных способа сделать это:
1) Преобразовать оба значения в «float» (это должно сделать значения одинаковыми, так что это, вероятно, не то, что делает компилятор)
2) Преобразовать оба значения в «int» (это может показывать или не отображать их одинаково ... преобразование в int часто усекается, поэтому, если значение с плавающей запятой равно 16777216.99999, преобразование в «int» будет усекать )
3) Преобразовать оба значения в «double». Я думаю, что это то, что будет делать компилятор. Если это то, что делает компилятор, два значения определенно будут разными. Двойной тип может содержать 16777217 в точности, и он также может точно представлять значение с плавающей запятой, в которое конвертируется 16777217.0 (что не совсем 16777217.0).