'short int'持有的值溢出,但"自动"不会溢出?

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

本文关键字:溢出 自动 int short      更新时间:2023-10-16
#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,但我只是想知道,这里发生了什么?

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

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

它太大了,无法容纳在平台上的short中,所以short溢出了,实现定义了结果。

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

一个解决方案是使用惯用

for(auto&& value: values){

问题非常简单,2字节的short类型整数只能容纳-32768到32767之间的值。之后,它会溢出。您给出了60000,这显然是short int的溢出。

当你在这里使用auto时,value会被转换成一个合适的类型,它可以容纳这么大的数字(注意,这取决于你运行程序的平台。(

在我的例子中,value被转换为unsigned long,其范围在0到4294967295之间。