铸造时不同的截断结果

tkw*_*954 4 c casting truncate rounding

我在预测我的C代码将如何截断结果时遇到一些困难.请参阅以下内容:

float fa,fb,fc;
short ia,ib;

fa=160
fb=0.9;
fc=fa*fb;
ia=(short)fc;
ib=(short)(fa*fb);
Run Code Online (Sandbox Code Playgroud)

结果是ia = 144,ib = 143.

我可以理解这两种结果的推理,但我不明白为什么这两种计算的处理方式不同.任何人都可以推荐我这个行为的定义或解释差异?

编辑:结果使用英特尔酷睿i3-330m上的MS Visual C++ Express 2010进行编译.我在同一台机器上的Virtual Box下的gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5)上得到了相同的结果.

asc*_*ler 7

允许编译器对子表达式使用更高的精度,就像fa*fb分配给float变量一样fc.因此,fc=它是非常轻微地改变结果的部分(然后发生在整数截断中产生差异).