即使L后缀,C中的十六进制常量也是无符号的

前端之家收集整理的这篇文章主要介绍了即使L后缀,C中的十六进制常量也是无符号的前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道这是一个简单的问题,但我很困惑.我有一个相当典型的 gcc警告,通常很容易修复:
警告:有符号和无符号整数表达式之间的比较

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

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

我已经特别为常量加了后缀,为什么会发生这种情况呢?

解决方法

Unsigned hexadecimal constant in C?的答案是相关的.带有L后缀的十六进制常量将具有可以保存其值的以下第一种类型:
long
unsigned long
long long
unsigned long long

有关详细信息,请参见C99 draft,[6.4.4.1]部分.

在你的平台上,long可能是32位,因此它不足以容纳(正)常量0x80000000.所以你的常量类型为unsigned long,这是列表中的下一个类型,足以保存该值.

在长为64位的平台上,您的常量将为long类型.

原文链接:https://www.f2er.com/c/119529.html

猜你在找的C&C++相关文章