提问者:小点点

“short int”保存的值溢出,但“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

我知道我不应该在内部使用short进行循环,最好使用auto,但我只是在想,这是怎么回事?

我相信我使用的Ubuntu是带有g++9.3.0的。


共2个答案

匿名用户

当达到元素60000时,出现了short value的问题。

它太大,无法容纳在您的平台上的short中,因此您的short会溢出,并带有实现定义的结果。

在您的示例中,发生的情况似乎是60000换行为负-5536,然后(以定义良好的方式)转换为无符号长,在您的示例中为264-5536:这等于程序显示的最大值。

一个解决办法是使用惯用语

for(auto&& value: values){

匿名用户

问题非常简单,2字节的short类型整数只能保存-32,768到32,767之间的值。 然后,它就溢出来了。 您给出了60000,这显然是short int的溢出。

当您在这里使用auto时,将转换为一个适当的类型,该类型可能包含如此大的数字(请注意,这取决于运行程序的平台)

在我的示例中,被转换为无符号长,其范围在0到4,294,967,295之间。