unsigned intが負の値を保持できないことはわかっています。ただし、次のコードはエラーや警告なしでコンパイルされます。
unsigned int a = -10;
変数aを出力すると、間違った値が出力されます。署名されていない変数が署名された値を保持できない場合、コンパイラはエラー/警告を出さずにコンパイルできるのはなぜですか?
何かご意見は?
編集
コンパイラ: VC++ コンパイラ
解決
警告レベル 4 を使用する必要があります。
unsigned intが負の値を保持できないことはわかっています。ただし、次のコードはエラーや警告なしでコンパイルされます。
unsigned int a = -10;
変数aを出力すると、間違った値が出力されます。署名されていない変数が署名された値を保持できない場合、コンパイラはエラー/警告を出さずにコンパイルできるのはなぜですか?
何かご意見は?
編集
コンパイラ: VC++ コンパイラ
解決
警告レベル 4 を使用する必要があります。
警告 C4245: 'initializing': 'int' から 'unsigned int' への変換、signed/unsigned の不一致
警戒レベル4。
警告が表示されます:
警告: 負の値の変換
-0x00000000a' to
unsigned int'
-W ディレクティブなし。
以下を使用する必要があります。
gcc main.c -Wconversion
警告が表示されます:
警告: 符号なし型に暗黙的に変換された負の整数
-Wall はこの警告を有効にしないことに注意してください。
警告レベルを上げる必要があるかもしれません。
signed int
aを an に変換することunsigned int
は、C 標準では「通常の算術変換」として知られているため、エラーではありません。
コンパイラがデフォルトでこれに関する警告を発行しないことが多い理由は、コードで一般的に行われているため、一般的に発行される「誤検知」警告が多すぎるためです。signed int
本質的に署名されていないもの (たとえば、バッファ サイズの計算) を処理するために値を操作する非常に多くのコードがあります。式で符号付きと符号なしの値を混在させることも非常に一般的です。
これらのサイレント変換がバグの原因ではないと言っているわけではありません。したがって、最初から「クリーン」になるように、新しいコードの警告を有効にすることは悪い考えではないかもしれません。ただし、既存のコードによって発行された警告を処理するのは、おそらく圧倒されると思います。
g++ 4.9.2 を使用しており、この警告を表示するには -Wsign-conversion を使用する必要があります。
gcc.gnu.org : C++ では、-Wsign-conversion が明示的に有効にされていない限り、符号付き整数と符号なし整数の間の変換に関する警告はデフォルトで無効になっています。
-10 は整数値として解析され、int を unsigned int に割り当てることができます。何か間違ったことをしていることを知るために、コンパイラは整数 (-10) が負か正かをチェックする必要があります。型チェック以上のものなので、パフォーマンスの問題で無効になっていると思います。
gcc コンパイラの場合、追加できます
gcc -Wconversion ...
そして、これは次の警告を生成します
warning: converting negative value '-0x0000000000000000a' to 'unsigned int'