【发布时间】:2021-03-08 12:01:16
【问题描述】:
以下 C/C++ 代码:
long long foo = -9223372036854775808LL; // -2^63
使用警告编译 (g++)
整数常数太大了,它是无符号的。
clang++ 给出了类似的警告。
感谢此错误报告:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52661。我现在明白为什么 GCC 会给出这个警告。不幸的是,对错误报告的响应并没有很好地解释这种行为的原因。
问题:
- 为什么 32/16/8 位有符号整数常量的等效代码没有给出警告?
- GCC 和 Clang 都给出了这个警告,所以这显然是故意的行为,而不仅仅是在响应错误报告时建议的“使其更易于解析”。为什么?
- 这种行为是 C/C++ 标准规定的吗?其他标准?
【问题讨论】:
-
@AndrewHenle 对于十进制常量来说,这绝不是一个奇怪的警告,因为
0x8000000000000000LL不会生成警告,但它太大了以至于它没有符号。但在这种情况下,标准将其包含在定义明确的行为中,即使它并不明显。 -
@phuclv 是的,这绝对是重复的,但是让我们冷静一下,看看是否应该关闭这篇文章,或者你链接的那个应该被关闭,因为这个帖子是骗人的。特别是,链接的帖子没有对实际标准提供任何参考,只有 cppreference.com。另外,我认为这里的这个问题比被骗的问题更清楚。
-
@phuclv 谢谢,我看过那篇文章,但显然没有仔细阅读。
-
@AndrewHenle 整数常量的类型是如何定义的并不明显。我认为假设 2,147,483,648 被提升为 unsigned int 然后导致 -2,147,483,648 给出相同的编译器警告是完全合理的(尽管我同意使用 short 是一个坏例子)。我不明白这与解析令牌有什么关系,这就是对错误报告的响应所关注的内容。所以是的,我确实认为它是盲目的。
-
@AndrewHenle 此外,误解某事并急于解释是不会眨眼的。当被问到时拒绝正确解释某事(或承认你不知道答案),是眨眼的。