解决了,VC6中实验,代码如下:
int CTestDlg::ToInt(double f_in)
{
int i_out;
unsigned short int cr_0,cr_t;
__asm
{
// FPU控制字的意义
// 027F:四舍五入取整 15.555 -> 16
// 0E7F:抹去小数部分取整 15.555 -> 15
FLD f_in // f_in 压栈
WAIT
FSTCW cr_0 // FPU控制字(027F) -> cr_0
WAIT
MOV AX,cr_0 // cr_0 -> AX
OR AH,0xC // AH(0010) or 0xC(1100) -> AH(1110)
MOV cr_t,AX // AX(0E7F) -> cr_t
FLDCW cr_t // cr_t(0E7F) -> 浮点控制寄存器
FISTP i_out // 将栈顶的数据取整
FLDCW cr_0 // cr_0(027F) -> 浮点控制寄存器
}
return i_out;
}
继续实验,代码如下:
int i_out;
double f_in;
for(f_in=15;f_in<16;f_in+=0.000000001)
{
i_out = ToInt(f_in);
if(i_out != (int)(f_in))
::AfxMessageBox("不等价于(int)(f_in)!!");
}
结果是FPU控制字为0E7F时,完全等价于C++中的(int)()
呵呵。舒服ing.