gpt4 book ai didi

c - 为什么 0x8000000000000000LL 被 gcc 认为是 unsigned long long?

转载 作者:太空狗 更新时间:2023-10-29 15:23:12 25 4
gpt4 key购买 nike

我正在编译一段代码,其中 0x8000000000000000LL 文字的值用于识别未知/不受支持的值。

LL 后缀表示该值应解释为 (signed) long long (int ),但是 gcc(我已经尝试过 4.8.5 和 4.1.1)说该值是 unsigned long long 类型。

我在这里放了一个示例代码:

#include <stdio.h>

#define UNKNOWN 0x8000000000000000LL

int main(void){
long long value = 1000;

if ((unsigned long long) value == UNKNOWN) {
puts("Yes, they are different!!");
}

if (value == (long long) UNKNOWN) {
puts("Yes, they are different!!");
}

if (value == UNKNOWN) {
puts("Yes, they are different!!");
}
return 0;
}

用这个命令 gcc -Wsign-compare ll.c 编译的结果是这样的:

ll.c: In function ‘main’:
ll.c:16:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if (value == UNKNOWN) {
^

为什么 0x8000000000000000LL 文字值被认为是无符号的?

最佳答案

因为它适用于十六进制或八进制的整数文字,并且不适合后缀建议的整数类型。

6.4.4.1p5 :

The type of an integer constant is the first of the corresponding list in which its value can be represented.

enter image description here

请注意,与十进制整数文字不同,没有 u/U 后缀的十六进制和八进制文字可以在搜索合适的类型时,在上升到之前翻转类型符号下一个更高级别的有符号整数类型。

关于c - 为什么 0x8000000000000000LL 被 gcc 认为是 unsigned long long?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53006486/

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