【发布时间】:2015-06-04 00:33:42
【问题描述】:
我在 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),我仍然会收到警告。我希望明确告诉编译器将我的常量解释为有符号值会使警告静音。
【问题讨论】:
-
没有
int32_t可以等于0xFFFFFFFF。如果你想要-1,写-1。 -
INT32_C(X)不在 ISO C 中,但应该将int32的整数后缀应用到X。这不是演员表。在具有 32 位 int 的系统上,32 位 int 将没有后缀,因此此宏对参数没有影响。 -
@Matt McNabb
INT32_C(X)在 C11“最小宽度整数常量的宏”第 7.20.4.1 节 1 -
@chux 太酷了。我在 inttypes.h 下查找,但结果发现它在 stdint.h 中
标签: c gcc signedness