は、以下のコードを検討:符号なしタイプのアンダーフロー警告が表示されないのはなぜですか?
unsigned int n = 0;
unsigned int m = n - 1; // no warning here?
if (n > -1) {
std::cout << "n > -1.\n";
} else {
std::cout << "yes, 0 is not > -1.\n";
}
上記のコードは、符号付きおよび符号なし整数式を比較するためのif
条件if (m > -1)
に警告を生成します。私はそれに反対していません。最初の2つの割り当てステートメントは私を悩ますものです。
unsigned int n = 0;
unsigned int m = n - 1;
私の思考コンパイラから減算する試みがあったこと、それは変数n
は、最初の行から0
の値を符号なしであることを知っているので、私の第二の割り当てに警告を与えられたとしているべきであるということですゼロの値を返し、それを符号なしの型に割り当てます。
2回目の割り当て後の次の行がif
の文などと異なる場合は、関係するコードがスリップしている可能性があります。
はい、m
への割り当ての前に狭い変換があります。はい、コンパイラはMarshall ClowのC++ Now 2017 Lightning Talk(Fighting Compiler Warnings)にも言及しています。
short s = 3 * 6;
short s = integer * integer;
short s = integer;
コンパイラは、そのコードでアンダーフローが発生する可能性について教えてくれませんか?
コンパイラ:
- クラン3.7/4.0(-Wall -Wextra)
- GCC 5.3/7.1.1(-Wall -Wextra -pedantic)
- のMicrosoft C/C++ 19.00.23506
どのような警告が表示されますか?あなたがif文で受ける警告は、「符号なしint m = n-1;で起きていないもの」である符号付き整数式と符号なし整数式の比較です* – NathanOliver
'-Wall'オプションと' -Wextra'オプションを試しましたか? GCCの? – Plouff
@Plouff:はい、GCCで-Wall -Wextraを使用しました。 –