读书人

小弟我想问一下 浮点类型是如何转换为

发布时间: 2012-05-21 18:04:41 作者: rapoo

我想问一下 浮点类型是怎么转换为整型的
浮点类型和 整型数据的存贮格式不一样 那它们是怎么实现转换的


[解决办法]
去掉小数部分不就是整数了啊。。
[解决办法]
我正在看<深入理解计算机系统>的第二章,楼主也看看吧,或许能解释你的疑惑.
[解决办法]
各类数值类型储存形式都是二进制,解析格式不同而已,具体怎么解析,你要看机器的浮点数格式
[解决办法]
强制转化有个中间值,地址和那个不一样
[解决办法]
这个问题好像问过了,再重复一遍

不同的编译其有不同的实现,在VC2008,我将C代码编译成汇编,发现他首先使用浮点指令fld,然后调用一个VC2008的内存库函数_ftol2_sse。见下

fld DWORD PTR _a$[ebp]
call __ftol2_sse
关于_ftol2_sse这个函数,我goole了一下,得到的信息是:
ftol2_sse是一个内部的C函数,当从1个浮点类型变量到整数时使用,他首先使用在VC2005,在这之前,他是ftol_sse,更早则是ftol。


_ftol2_sse这个内部库函数应该是用汇编语言写的。


[解决办法]

C/C++ code
解决了,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.
[解决办法]
强制转换符可以用,b=(int)a
而且转换时a的值不变,只是用一个过度值赋给b

读书人网 >C语言

热点推荐