将int转换为float:如何完成

Xu *_*ong 8 c c++ casting type-conversion

我是C编程语言的新手,我想问一个问题.

整数我在这里铸造浮动然后f(不知何故)成功代表5.0:

int i = 5;
float f = i;   //Something happened here...
Run Code Online (Sandbox Code Playgroud)

但是,如果我们尝试这种方法:

int i = 5;
float f = *(float *)&i;
Run Code Online (Sandbox Code Playgroud)

f不会得到5.0,因为它以"float的方式"解释存储在i中的位.那么编译器在第一种情况下实际上做了多少魔术呢?这似乎是一项非常努力的工作......有人可以指明吗?谢谢.

Ste*_*sop 13

这是一项努力工作,但任何具有浮点支持的CPU都会提供执行它的指令.

如果您必须int为自己将2的补码转换为IEEE浮点格式,您将:

  • 取整数base-2 log(与最高设置位的索引密切相关),它给出了指数.偏移它并将其存储在浮点数的指数位中.
  • nint 的顶部位(从第一个设置的非符号位之后的位开始)复制到float的有效位数中.n然而,在a float(23位为32位单精度浮点数)中有很多有效位.如果其中有任何剩余位int(即,如果它大于2 24),并且在您有空间的位之后的下一位是1,则根据操作中的IEEE舍入模式,您可能会或可能不会向上舍入.
  • 将符号位从中复制intfloat.


par*_*mar 6

如果你看看组件

    int i = 5;
000D139E  mov         dword ptr [i],5  
    float f = i;
000D13A5  fild        dword ptr [i]  
000D13A8  fstp        dword ptr [f]  
Run Code Online (Sandbox Code Playgroud)

fild是神奇的东西