Intelマシンで次のCコードを実行すると...
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をunsignedcharに強制変換すると、すべてのプラットフォームで同じ結果が得られると考えるのは間違っていましたか?
彼はコンパイラの問題でしょうか?
エレガントな回避策はありますか?