'short int' 持有的值溢出了,但 'auto' 没有?

The value held by 'short int' get overflowed, but not with 'auto'?

#include <iostream>

using namespace std;

int main()
{
    unsigned long maximum = 0;
    unsigned long values[] = {60000, 50, 20, 40, 0};
    
    for(short value : values){
        cout << "Current value:" << value << "\n";

        if(value > maximum)
            maximum = value;
    }
    cout << "Maximum value is: " << maximum;
    
    cout << '\n';
    return 0;
}

输出是:

Current value:-5536
Current value:50
Current value:20
Current value:40
Current value:0
Maximum value is: 18446744073709546080

我知道我不应该在 for 循环中使用 short,最好使用 auto,但我只是想知道,这里发生了什么?

我正在使用 Ubuntu 我相信 g++ 9.3.0

当到达元素 60000 时,问题出在 short value

这太大了,无法放入您平台上的 short,因此您的 short 溢出,具有实现定义的结果。

你的情况似乎是 60000 环绕到负值 -5536,然后(以明确定义的方式)转换为 unsigned long,这在你的情况下是 264 - 5536:这等于你的程序显示的最大值。

一个解决方法是使用惯用的

for(auto&& value: values){

问题很简单,2字节short类型的整数只能容纳-32,768到32,767之间的值。之后,它会溢出。你给了 60000,这显然是 short int.

的溢出

当您在此处使用 auto 时,value 会转换为可以容纳如此大数字的适当类型(请注意,这取决于您所在的平台 运行 程序。)

在我的例子中,value 被转换为 unsigned long,范围在 0 到 4,294,967,295 之间。