这两个表达式有什么区别

nuptxxp 2012-05-04 12:30:59
今天居然被c++一个语法问题导致数据一直出错
后来debug N久,才发现是下面语句出问题了

long long Ans=0;
for(int i=1;i<=State;++i){
Ans += (long long)(ans[0][i] * ans[1][i]);
}


long long Ans=0;
for(int i=1;i<=State;++i){
Ans += (long long)ans[0][i] * ans[1][i];
}

第一个是我的有问题的语句,第二个是我后来改正后(就是少了一个括号,导致数据一直算错,溢出问题)
其中 ans数组是int型的
请教各位 这两个的区别在哪,为什么第一个会导致错误?

我的想法是,第一个先计算了后面两个的积,然后再进行强制类型转换,这样就会有溢出现象
第二个是先把第一个ans[0][i]强制转换,然后再与ans[1][i]相乘,由于c++向高位靠拢,故最后还是一个64位的整数.
(可是写的时候想当然把c,c++的强制转换融合了,都没怎么注意,debug的时候,怎么都没想到竟然是这个小点出问题了.....)
...全文
94 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
relaxisland 2012-05-04
  • 打赏
  • 举报
回复
(long long)(ans[0][i] * ans[1][i]);
如果是防止 ans[0][i] * ans[1][i] 溢出,你这种转换没有意义,
因为你转换之前 int * int = int,已经溢出了
把一个已经溢出了int 赋值给long long,得到的当然是溢出后的值咯

先转换,就是int计算 转换成long计算,就避免了溢出了。
大尾巴猫 2012-05-04
  • 打赏
  • 举报
回复
我有次也发生了同样的问题,还好,很快找到了原因
是2个int变量相除,然后赋值给double类型的
输出发现没小数点。马上意识到忘记强制转换1个参数了。
nice_cxf 2012-05-04
  • 打赏
  • 举报
回复
(long long)(ans[0][i] * ans[1][i]);
是把结果转成long long,但之前是两个int相乘,如果已经溢出,转换也没用
(long long)(ans[0][i]) * ans[1][i];
是把ans[0][i]转成long long,这样结果是long long,由于先转换,不会出现溢出
SONG_CA 2012-05-04
  • 打赏
  • 举报
回复
问一句,为啥 用 long long 两个呢

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧