我们运行起来,然后看看cpu中的代码:
在aa = (int)(A[0]*90/360.0);处的asm代码为:
imul eax,dword ptr [SysInit::_16387 + 0x18],0x51
mov [ebp-0x14],eax
fild dword ptr [ebp-0x14]
fld tbyte ptr [0x004013ec]
fmulp st(1)
call CC3260MT.__ftol
mov [ebp-0x04],eax
在bb = (int)(B *90/360.0);处的代码为:
mov [ebp-0x08],0x00000001
我对汇编不大懂,不过还是可以看出来,在运行
aa = (int)(A[0]*90/360.0);时,是真正的去计算这个算式,
而运行
bb = (int)(B *90/360.0);时,是直接将结果1给了bb,换成c的代码,就是这样:
bb = 1;
不用问,着肯定是编译器优化了。至于A[0]为什么没有优化,我想可能是因为他是个数组,
要得到他的值比较麻烦(还要多一次寻址),所以就采用了真正运算的方法,结果由于符点
数的精度问题,导致结果为0。
将代码改为这样:
int aa, bb;
int n = 90;
aa = (int)(A[0]*n/360.0);
bb = (int)(B *n/360.0);
用一个变量来代替那个90,因为算式里有了变量,所以编译器就没有优化,我用bcb6.0来测试,最后输出的结果为:
@: aa=0, bb=0, cc=0.