'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 之间。
#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 之间。