注册 登录
编程论坛 C++教室

VISUAL STUDIO提示C26451,这是和vector最大容量相关吗?

wolfcan 发布于 2022-01-01 21:49, 3372 次点击
代码如下,但是VS在a+1处有波浪线,提示C26451,算术溢出: 使用 4 字节值上的运算符 * ,然后将结果转换到 8 字节值。在调用运算符 * 之前将值强制转换为宽类型可避免溢出(io.2)。请问哪里会涉及8字节的结果呢?难道是vector的数量初始化的数量是8个字节?请各位指教,谢谢。
程序代码:


int a=3;
std::vector<int> color(a+1);


7 回复
#2
rjsp2022-01-02 11:51
不知所云,哪些是vs说的话,哪些是你说的话,我都分不清

vector的构造函数要求参数是 size_t 类型,
VS告诉你,“int运算后,再转化为size_t” 与 “先转化为size_t,再运算” 是不一样的,前者若发生了溢出,转化成更宽的类型已经无济于事了。

没什么意义的警告,正常人既然知道“vector的构造函数要求参数是 size_t 类型”,那他就会定义成
size_t a=3;
#3
wolfcan2022-01-02 23:18
回复 2楼 rjsp
VS提示内容:C26451,算术溢出: 使用 4 字节值上的运算符 * ,然后将结果转换到 8 字节值。在调用运算符 * 之前将值强制转换为宽类型可避免溢出(io.2)。
*********************************分割线**************************************************
那我现在的理解是:变量a是int类型,是4个字节,数字1也是4个字节,而color(a+1)调用构造函数时要先将a+1转换为8字节的size_t类型,在这个过程中可能会出现溢出。
那么正确的写法是不是应该改成下面样子?谢谢

size_t a=3;
std::vector<int> color(a+static_cast<size_t>(1));


#4
rjsp2022-01-03 14:17
size_t a=3;
std::vector<int> color(a+1);
就行了
#5
rjsp2022-01-03 14:38
而color(a+1)调用构造函数时要先将a+1转换为8字节的size_t类型,在这个过程中可能会出现溢出。

VS认为,int 相对于 size_t 是窄类型,size_t 相对于 int 是宽类型。
static_cast<size_t>(a+1) 是先进行窄类型运算(a+1)再转换成size_t,如果在窄类型运算时发生了溢出,再去转换成size_t也已经无济于事了。
VS那句话是个提醒,提醒你“在窄类型上运算,再转成宽类型”与“转成宽类型,再运算”的结果可能是不一样了。
#6
rjsp2022-01-03 14:54
打个比方,你想将两条鲸鱼放到大海里。
正常而言,你将鲸鱼一条条扔大海就行了。
但VS发觉你是先将两条鲸鱼塞到文具盒里,再将文具盒打开,放两条鲸鱼进大海。
VS就很奇怪了,它提醒你“将两条鲸鱼塞到文具盒里”时可能发生溢出,虽然最终大海能容纳得下两条鲸鱼,但在“将两条鲸鱼塞到文具盒里”时鲸鱼可能已经被被挤死了,再入大海已经无力回天。

VS奇怪你为什么放两条鲸鱼入大海要先过文具盒这道不必要的关卡
VS奇怪你为什么size_t计算时要先过int这道不必要的关卡
#7
wolfcan2022-01-03 22:36
回复 5楼 rjsp
谢谢。那为什么对于数字1不先转化成size_t呢?因为a现在是size_t,数字1是int类型,color(a+1)的时候应该是先进行a+1(这个过程是一个宽类型+一个宅类型,这二者谁进行类型转换呢?),然后再将相加结果转换为size_t类型吧?
#8
rjsp2022-01-04 16:40
这个过程是一个宽类型+一个宅类型,这二者谁进行类型转换呢?
对于 a + b
取 a的类型、b的类型、int类型 这三者中最大的类型,然后将两个操作数都提升成这个类型
https://zh.
1