我定义了一个枚举如下:
typedef enum { x = 1ULL<<40 } e;
看起来表达式“x”计算结果为1UL<<40。
然而,C11 6.4.4.3规定:“声明为枚举常量的标识符的类型为int。”
顺便说一下,这救了我的一天,因为我想要枚举值>1<<32。然而,我需要知道如何做到这一点;我有点紧张编写不符合标准的代码。
我尝试了这段代码:
int main() {
printf("%zu %zu %lx\n", sizeof(e), sizeof(x), x);
return 0;
}
使用 gcc -std=c11 -Wall
进行编译 (gcc 8.3.1, linux x86_64), 输出为:8 8 10000000000
。
如果将 %lx 改为 %llx,将会收到一个编译警告,但输出结果相同,这表明 x 的大小为 long。
根据我的阅读理解,我期望会收到编译警告和输出 4 4 0
。
1ULL<<40
不行。嗯嗯。 - chux - Reinstate Monica