为什么这个浮动联合NaN的输出?

mof*_*tje 4 c++ floating-point unions

在我的C++代码中,我已经声明了一个联合:

typedef union U_FloatParse {
    float float_data;
    unsigned char byte_data[4];
} U_FloatConvert;
Run Code Online (Sandbox Code Playgroud)

然后,我将byte_data数组设置为值0,0,192,127:

U_FloatConvert depth_data;

depth_data.byte_data[0] = 0;
depth_data.byte_data[1] = 0;
depth_data.byte_data[2] = 192;
depth_data.byte_data[3] = 127;

printf("\n\nFloat = %f\n\n", depth_data.float_data);
Run Code Online (Sandbox Code Playgroud)

作为输出我得到NaN.为什么我没有得到正常的浮点值?当我传递值时:56,137,33,63.我得到浮点值0.631000.

测试代码:http://codepad.org/Q8ds1V0F

Lig*_*ica 6

NaN 正常的浮点值,您设置的字节被正确解释为有效的NaN.

话虽这么说,你可能得到输出"没有勺子 NaN",因为以这种方式使用联合在C++中有未定义的行为.您只能在任何给定时间使用工会成员之一.这不是重新诠释的捷径!


glg*_*lgl 6

通过将所述字节写入数组,您将得到一个内存布局00 00 c0 7f,在小,读取为7fc00000.将此解释为IEEE浮点数就可以实现

  • 0的符号(正,但与NaN无关)
  • 指数 0xFF
  • 尾数为0x400000(> 0且最高位设置→静音)

它会获得(无声)NaN值.

至少,这对C来说很重要.在C++中,它没有定义你做什么,但是如果你得到NaN了结果,你的编译器会把它当作C来处理它(不建议依赖于未定义的行为!).