定数の符号に関する gcc の解釈で、いくつかの興味深い動作に遭遇しました。以下のような(大幅に簡略化された)コードがあります。
#define SPECIFIC_VALUE 0xFFFFFFFF
//...
int32_t value = SOMETHING;
if (value == SPECIFIC_VALUE) {
// Do something
}
上記をコンパイルすると、warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
どうやら gcc は 16 進定数を符号なしと解釈し、符号付き整数との比較を好まないようです。ただし、定義を のようなものに変更すると#define SPECIFIC_VALUE 0x7FFFFFFF
、警告が消えます。繰り返しますが、私は特に驚くことはありません。符号ビットが 0 であると、gcc は定数を符号付きの値として解釈するのが楽になります。本当に驚いたのは、定義を に変更しても#define SPECIFIC_VALUE INT32_C(0xFFFFFFFF)
、まだ警告が表示されることです。定数を符号付きの値として解釈するようにコンパイラに明示的に指示すると、警告が消えます。