次のコードの場合
static inline float fix2float(int64_t f)
{
return (float)f / (1 << 60); // <-- error here
}
コンパイラはこれらの警告を出しています。
warning: left shift count >= width of type
warning: division by zero
64 > 60 のときにコンパイラがこれらの警告を出すのはなぜですか?
1
C 実装では 64 ビット数ではありません。これは、int
おそらく 32 ビットです。
コンパイラは式を調べたり、関連する があることを確認したりしませんint64_t
。したがって、他の算術演算では 64 ビットを使用する必要があります。そのパーツから表情を作り上げていきます。の部分(1 << 60)
では、コンパイラは 1 つを認識し、 の型を与えます。これint
は、C の規則が単純な定数値を処理するように指示しているためです (16 進表記、接尾辞、および大きな値には追加の規則があります)。したがって、 anを 60 ビット1 << 60
シフトしようとします。int
システム上の は 32 ビットしかないためint
、コンパイラは警告します。
これをより適切に記述する方法は、 ですreturn f * 0x1p-60f;
。値が 2 –600x1p-60f
のfloat
定数です。