Когда я запускаю следующий код C на компьютере Intel ...
float f = -512;
unsigned char c;
while ( f < 513 )
{
c = f;
printf( "%f -> %d\n", f, c );
f += 64;
}
... вывод выглядит следующим образом:
-512.000000 -> 0
-448.000000 -> 64
-384.000000 -> 128
-320.000000 -> 192
-256.000000 -> 0
-192.000000 -> 64
-128.000000 -> 128
-64.000000 -> 192
0.000000 -> 0
64.000000 -> 64
128.000000 -> 128
192.000000 -> 192
256.000000 -> 0
320.000000 -> 64
384.000000 -> 128
448.000000 -> 192
512.000000 -> 0
Однако, когда я запускаютот же код на устройстве ARM (в моем случае iPad), результаты совершенно разные:
-512.000000 -> 0
-448.000000 -> 0
-384.000000 -> 0
-320.000000 -> 0
-256.000000 -> 0
-192.000000 -> 0
-128.000000 -> 0
-64.000000 -> 0
0.000000 -> 0
64.000000 -> 64
128.000000 -> 128
192.000000 -> 192
256.000000 -> 0
320.000000 -> 64
384.000000 -> 128
448.000000 -> 192
512.000000 -> 0
Как вы можете себе представить, такого рода разница может привести к ужасным ошибкам в крестепроекты.Мои вопросы:
Не ошибся ли я, предположив, что приведение float к неподписанному символу даст одинаковые результаты на всех платформах?
Может ли это быть проблемой компилятора?
Есть ли элегантный обходной путь?