#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
的。
当达到元素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之间。