尝试使用计算值按索引获取向量元素时遇到警告。
警告 C26451 算术溢出:对字节值 4 使用“+”运算符并将结果转换为字节值 8。在调用“+”运算符之前将值转换为更宽的类型以避免溢出 (io.2)。
显示警告的示例代码:
#include <iostream>
#include <vector>
int main() {
std::vector<int> a{0,1,2,3,4,5};
int b = 0;
std::cout << a[b + 1] << std::endl; // подчеркивает 'b+1'
return 0;
}
为什么会出现这个警告?
根据我的理解,溢出是尝试向变量写入大于分配给该变量的内存的值。
我在这里理解这个警告:
unsigned char c = 24;
c += 250;
但在本例中,IDE 没有发现问题。
我对溢出的定义哪里出了问题?
还注意到,将 VS2019 配置管理器中的平台从 x64 更改为 x86 会使此警告消失。
在这种情况下,警告的本质如下:在64位平台上索引向量时,使用64位无符号整数,但表达式“b+1”是int类型。如果我们假设 b 包含 int 类型可表示的最大值,则我们得到 UB。解决办法:至少将其中一个操作数转换为64位类型。
编译器在这里抱怨的不是特定值,而是表达式中使用的类型。