gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:01:01 26 4
gpt4 key购买 nike

我知道这是一个简单的问题,但我很困惑。我有一个相当典型的 gcc 警告,通常很容易修复:
警告:有符号和无符号整数表达式之间的比较

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

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

我已经专门为常量添加了 long 后缀,那么为什么会这样呢?

最佳答案

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 类型,这是列表中的下一个类型,足以保存该值。

long 为 64 位的平台上,您的常量将具有 long 类型。

关于c - C 中的十六进制常量是无符号的,即使 L 后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6728900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com