2

次のコードの場合

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 のときにコンパイラがこれらの警告を出すのはなぜですか?

4

2 に答える 2

9

1C 実装では 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-60ffloat定数です。

于 2013-04-18T14:04:24.460 に答える