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