整数文字的类型默认不是int?

整数文字的类型默认不是int?

我刚刚回答了这个问题,它问为什么迭代直到for循环中的100亿需要更长时间(OP实际上在10分钟后中止)比迭代直到10亿:

for (i = 0; i < 10000000000; i++)

现在我和其他许多人明显的答案是,这是因为迭代变量是32位(从未达到100亿)并且循环得到无限循环。

但是虽然我意识到了这个问题,但我仍然想知道编译器内部究竟发生了什么?

由于文字没有附加一个L,它应该是IMHO类型int,因此32位。因此,由于溢出,它应该是int范围内的正常可达。为了真正认识到无法从中获取int,编译器需要知道它是100亿,因此将其视为超过32位的常量。

这样的文字是否会自动升级到拟合(或至少是实现定义的)范围(在这种情况下至少是64位),即使没有附加L并且是这个标准行为?或者是在幕后发生了什么不同,比如UB由于溢出(整数溢出实际上是UB)?标准中的一些引用可能很好,如果有的话。

虽然最初的问题是C,但我也很欣赏C ++的答案,如果有的话。


largeQ
浏览 502回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP