8

我知道这是一个简单的问题,但我很困惑。我有一个相当典型的 gcc 警告,通常很容易修复:
warning: comparison between signed and unsigned integer expressions

每当我有一个具有最高有效位的十六进制常量时,例如 0x80000000L,编译器会将其解释为无符号。例如,使用 -Wextra 编译此代码将导致警告 (gcc 4.4x, 4.5x):

int main()
{
long test = 1;
long *p = &test;
if(*p != 0x80000000L) printf("test");
}

我已经专门为常量加上了后缀,那么为什么会发生这种情况呢?

4

5 回答 5

12

C中无符号十六进制常量的答案?是相关的。带后缀的十六进制常量L将具有以下第一个可以保存其值的类型:

long
unsigned long
long long
unsigned long long

有关详细信息,请参阅C99 草案,第 [6.4.4.1] 节。

在您的平台上,long可能是 32 位,因此它不足以容纳(正)常量0x80000000。因此,您的常量具有 type unsigned long,这是列表中的下一个类型,足以容纳该值。

long64 位平台上,您的常量将具有 type long

于 2011-07-18T05:26:19.027 回答
1

因为您的编译器使用 32 位longs(并且可能也是 32 位ints)并且0x80000000不适合 32 位有符号整数,所以编译器将其解释为无符号。如何解决此问题取决于您要执行的操作。

于 2011-07-18T06:30:23.763 回答
0

根据 c 标准,十六进制常量是无符号的。

于 2011-07-18T05:26:03.143 回答
0

那是一个无符号长。我猜编译器决定像这样的十六进制文字最有可能是无符号的。尝试投射它(unsigned long)0x80000000L

于 2011-07-18T05:27:13.483 回答
0

C/C++ 中的十六进制常量始终是无符号的。但是您可以使用显式类型转换来抑制警告。

于 2011-07-18T05:28:27.330 回答