我正在编译一段代码,其中使用0x8000000000000000LL文字的值来标识未知/不受支持的值。
LL后缀表示应该将该值解释为a (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文本值被认为是无符号的?
发布于 2018-10-26 10:21:22
因为它适用于十六进制或八进制的整数文本,不适合后缀所建议的整数类型。
6.4.4.1p5
整数常量的类型是可以表示其值的对应列表中的第一个。

注意,与十进制整数文本不同,没有u/U后缀的十六进制和八进制文本在搜索合适的类型时,可以在升序到下一个更高的有符号整数类型之前翻转类型符号。
https://stackoverflow.com/questions/53006486
复制相似问题