'short int' 持有的值被溢出,但不是 'auto'?

1 c++ g++

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Current value:-5536
Current value:50
Current value:20
Current value:40
Current value:0
Maximum value is: 18446744073709546080
Run Code Online (Sandbox Code Playgroud)

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

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

Bat*_*eba 6

问题在于short value何时60000到达元素。

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

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

一种解决方法是使用惯用语

for(auto&& value: values){
Run Code Online (Sandbox Code Playgroud)