2016-12-16 41 views
4

在我的C++代码,我宣布一个联盟:为什么这个浮球联合NaN的输出?

typedef union U_FloatParse { 
    float float_data; 
    unsigned char byte_data[4]; 
} U_FloatConvert; 

然后,我的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); 

当输出我得到NaN的。为什么我不能获得正常的浮动值?当我通过这些值时:56,137,33,63。我得到的浮动值为0.631000。

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

+1

您使用的是C编译器或C++吗? –

+5

C或C++,标记一个。 “工会”在两者中都没有做同样的事情。 –

+5

AFAIK,这在C++中是未定义的。 (请仅标记C和C++中的一个,除非您询问它们之间的差异。) – molbdnilo

回答

6

通过将上述字节写入数组,您可以获得00 00 c0 7f的内存布局,其中很少有endian,其读数为7fc00000。解释这是一个IEEE float给你

  • (楠积极的,但不相关)一0标志
  • 0xFF
  • 的为0x400000(> 0尾数指数并设置了最显著位→无声)

它让你一个(沉默)NaN值。在C++中,它没有定义你所做的事情,但是如果你仍然得到NaN作为结果,你的编译器将它视为C(不建议依赖于未定义的行为!)。

0

如果输出不确定,通常会发生NaN(非数字)错误,即其值不能确定,如0/0。

但是我不会使用工会(个人不喜欢他们),当您使用联合时,它是未定义的行为来设置一个成员并提取不同的成员。

一方面,浮点值基本上被分割成位字段,有很多位持有尾数,所以很多位都保持指数,一位持有符号。另一方面,整数只是数字的基数2表示。他们的位不一样。

你可以这样做:

unsigned long int l = byte_data[0] | (byte_data[1] << 8) | (byte_data[2] << 16) | (byte_data[3] << 24); 
+1

虽然 – harold

+0

你不能像这样建立一个浮球啊,很明显......是否必须是浮球? ^^ –

+1

也许,我只是觉得如何构建一个整数来回答这个问题很奇怪,但这并不是真正的问题是关于 – harold