我在 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 将十六进制常量解释为无符号,并且不喜欢与有符号整数进行比较。但是,如果我将定义更改为类似#define SPECIFIC_VALUE 0x7FFFFFFF
的内容,警告就会消失。同样,我并不感到特别惊讶——符号位为零会使 gcc 更乐意将常量解释为有符号值。真正让我吃惊的是,如果我将定义更改为#define SPECIFIC_VALUE INT32_C(0xFFFFFFFF)
,我仍然会收到警告。我希望明确告诉编译器将我的常量解释为有符号值会使警告静音。