3
unsigned long long i = 1000;

0.1*i自動的にダブルに変換されるべきではありませんか?0.1*iそれでは、?を期待する関数パラメーターを渡したときに、コンパイラーが警告を表示しないのはなぜunsigned long longですか?私は、コンパイラーがそのような潜在的な精度の低下を警告することになっていると思いました。

コンパイラーClangを「-Weverything」で構成して、考えられるすべての警告を表示します。

4

2 に答える 2

6

はい、整数と浮動小数点数を操作すると、浮動小数点数になります。ただし、その結果(double)をunsigned long longを期待する関数に渡すと、暗黙のキャストが自動的に行われ、結果はunsignedlonglongに切り捨てられます。

なぜ警告が出なかったのですか?GCCと同様に、Clangの-Wallはすべての警告をオンにするわけではないため、-Wextraを使用して、実際にすべての警告を取得できます。

于 2012-09-01T15:23:02.587 に答える
4

任意の算術タイプの値を任意の算術タイプのオブジェクトに割り当てることができ、標準ではその警告が必要ないためです。

unsigned long long a = 0.1;  // C does not require a warning

上記の例では、は割り当て前に0.1変換されます。unsigned long long

また、プロトタイプ形式の関数に引数を渡すと、引数は割り当てのようにパラメーター型に変換されます。

于 2012-09-01T15:21:21.050 に答える