'short int'持有的值溢出,但"自动"不会溢出?
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
,但我只是想知道,这里发生了什么?
我相信我使用的是带有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之间。
相关文章:
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 普通环路未使用gcc 4.8.5自动矢量化
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- C++中无符号字符溢出
- QwtPlot具有相等的轴和自动缩放
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- Visual Studio 2017循环自动向量化问题
- 当C++中需要自动删除时,这是静态的正确用法吗?
- 自动重复 extern "C"函数中的类构造函数采用的相同参数
- 我怎样才能将所有子目录与 cmake 自动匹配
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- GCC 4.8.2 自动矢量化由于 cout 而失败
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 自动"yes"到 Popen SSH 命令
- 自动截断和 null 终止缓冲区溢出中的字符串缓冲区