同样的程序,为什么结果不同?

2019-07-15 08:15发布

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个结果完全不同?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
伏尔加的鱼
1楼-- · 2019-07-15 16:11
 精彩回答 2  元偷偷看……
jf_43942235
2楼-- · 2019-07-15 20:21
Ansersion 发表于 2018-6-21 09:26
问题出在这个式子:H=a*2*b/1000;
因为a,b均为int,所以a*2*b会先转成int,再除以1000。因为int最大为32767而a*2*b=900000,所以溢出了。推荐将a,b也声明成long就可以了。

那为什么
H=(long)a*2*(long)b/1000;
或者
H=(long)(a*2*b)/1000;
结果也都不对呢
灬今何在灬
3楼-- · 2019-07-15 20:32
我补充一点,C的计算顺序是从右到左哦。
灬今何在灬
4楼-- · 2019-07-15 23:11
jf_43942235 发表于 2018-6-24 08:16
那为什么
H=(long)a*2*(long)b/1000;
或者

你这个问题有点搞笑了,前面这位前辈都跟你说过运算溢出的问题了,编辑器默认的情况下,运算值的堆栈存储空间是INT32位的,H=(long)(a*2*b)/1000;的优先级是a*2*b此时堆栈分配空间是32位,H=(long)a*2*(long)b/1000;堆栈空间是64位的,因为*的优先级默认稍微比/高一点,虽然运算是从左到右,但是他会先计算*的值再除,否则你还是不能得到你需要的结果。

一周热门 更多>