完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
unsigned long H;
unsigned int a,b; a=1500; b=300; H=a*2*b/1000; ------------------------------------ H=a*2; H=H*b; H=H/1000; ------------------------------------ 为什么2个结果完全不同? |
|
相关推荐
6个回答
|
|
本帖最后由 Ansersion 于 2018-6-25 09:56 编辑
C语言说到底是个中间语言,最后还是还是会被编译成机器码。在机器码中,你的任何一步都是有中间变量存储的。 a*2->int:x x*b->int:y(溢出了) y / 1000:错误结果 a、b的变量类型决定了你的中间变量的类型。 PS:当然,现在编译器日新月异,优化功能越来越强,我刚刚用GCC在mac os x和ubuntu上试了(int+short),结果全是对的。或许有一天,你所用的编译器升级了,这个问题就不存在了。
最佳答案
|
|
|
|
问题出在这个式子:H=a*2*b/1000;
因为a,b均为int,所以a*2*b会先转成int,再除以1000。因为int最大为32767而a*2*b=900000,所以溢出了。推荐将a,b也声明成long就可以了。 |
|
|
|
计算数据的中间过程产生了溢出
|
|
|
|
Ansersion 发表于 2018-6-21 09:26 那为什么 H=(long)a*2*(long)b/1000; 或者 H=(long)(a*2*b)/1000; 结果也都不对呢 |
|
|
|
我补充一点,C的计算顺序是从右到左哦。
|
|
|
|
你这个问题有点搞笑了,前面这位前辈都跟你说过运算溢出的问题了,编辑器默认的情况下,运算值的堆栈存储空间是INT32位的,H=(long)(a*2*b)/1000;的优先级是a*2*b此时堆栈分配空间是32位,H=(long)a*2*(long)b/1000;堆栈空间是64位的,因为*的优先级默认稍微比/高一点,虽然运算是从左到右,但是他会先计算*的值再除,否则你还是不能得到你需要的结果。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1786 浏览 0 评论
【每周推荐】采用11代Intel CPU,基于youyeetoo X1开发板搭建少儿AI智能STEAM积木平台
982 浏览 0 评论
3094 浏览 2 评论
【youyeetoo X1 windows 开发板体验】+ 影音处理和AI模型移植
2733 浏览 5 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 移植zbar的方法
1831 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
6529 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-5-11 11:13 , Processed in 0.702200 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号