标题:VISUAL STUDIO提示C26451,这是和vector最大容量相关吗?
只看楼主
wolfcan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2021-12-9
结帖率:87.5%
已结贴  问题点数:20 回复次数:7 
VISUAL STUDIO提示C26451,这是和vector最大容量相关吗?
代码如下,但是VS在a+1处有波浪线,提示C26451,算术溢出: 使用 4 字节值上的运算符 * ,然后将结果转换到 8 字节值。在调用运算符 * 之前将值强制转换为宽类型可避免溢出(io.2)。请问哪里会涉及8字节的结果呢?难道是vector的数量初始化的数量是8个字节?请各位指教,谢谢。
程序代码:

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


搜索更多相关主题的帖子: 提示 容量 VISUAL 字节 vector 
2022-01-01 21:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
不知所云,哪些是vs说的话,哪些是你说的话,我都分不清

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

没什么意义的警告,正常人既然知道“vector的构造函数要求参数是 size_t 类型”,那他就会定义成
size_t a=3;
2022-01-02 11:51
wolfcan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2021-12-9
得分:0 
回复 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));


2022-01-02 23:18
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
size_t a=3;
std::vector<int> color(a+1);
就行了
2022-01-03 14:17
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
而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那句话是个提醒,提醒你“在窄类型上运算,再转成宽类型”与“转成宽类型,再运算”的结果可能是不一样了。
2022-01-03 14:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
打个比方,你想将两条鲸鱼放到大海里。
正常而言,你将鲸鱼一条条扔大海就行了。
但VS发觉你是先将两条鲸鱼塞到文具盒里,再将文具盒打开,放两条鲸鱼进大海。
VS就很奇怪了,它提醒你“将两条鲸鱼塞到文具盒里”时可能发生溢出,虽然最终大海能容纳得下两条鲸鱼,但在“将两条鲸鱼塞到文具盒里”时鲸鱼可能已经被被挤死了,再入大海已经无力回天。

VS奇怪你为什么放两条鲸鱼入大海要先过文具盒这道不必要的关卡
VS奇怪你为什么size_t计算时要先过int这道不必要的关卡
2022-01-03 14:54
wolfcan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2021-12-9
得分:0 
回复 5楼 rjsp
谢谢。那为什么对于数字1不先转化成size_t呢?因为a现在是size_t,数字1是int类型,color(a+1)的时候应该是先进行a+1(这个过程是一个宽类型+一个宅类型,这二者谁进行类型转换呢?),然后再将相加结果转换为size_t类型吧?
2022-01-03 22:36
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
这个过程是一个宽类型+一个宅类型,这二者谁进行类型转换呢?
对于 a + b
取 a的类型、b的类型、int类型 这三者中最大的类型,然后将两个操作数都提升成这个类型
https://zh.
2022-01-04 16:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-508055-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.240576 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved