2016-12-16 42 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