簡體   English   中英

從unsigned int轉換為float

[英]casting from unsigned int to float

我有一個32位無符號值,我想轉換為ieee 754浮點。

這是我的變量:

unsigned int val = 0x3f800000;  
float floatVal;

我知道我必須執行以下操作才能將uint值正確地轉換為我期望的iee 754浮點值1.0

floatVal = *((float*)&val);

任何人都可以解釋為什么floatVal =(float)val不會返回相同的結果? 而不是1.0 floatVal獲取值1.0653532e + 009。 我相信這部分是由於在這種類型轉換過程中丟失了比特,而這些比特是通過指針轉換保留的,但更詳細的解釋將非常受歡迎。

  1. 在當前的C標准(C99,C11)中,應該通過union來輸入pun ,而不是取消引用類型轉換指針:

     #include <stdint.h> uint32_t float_bits(const float f) { union { uint32_t u; float f; } temp; temp.f = f; return temp.u; } 
  2. 大多數當前架構使用IEEE-754 binary32格式用於float類型,但不是全部。 如果您的程序假定這一點,則應在文檔中說明。
    我個人喜歡在編譯時檢查它,如果我的代碼無法應對,則編譯失敗。

  3. 大多數當前體系結構對整數和浮點類型使用相同的字節順序( 字節順序 ),但不是全部。 同樣,如果您的程序假定這一點,它應該在文檔中說明,或者在編譯時檢查它(例如,在同一個項目中使用單獨的測試程序)。

  4. 在C中,表達式(type)variable將變量variable轉換為類型type 例如:

     int32_t my_truncate(float value) { return (int32_t)value; } 

    如果例如value == 2.125 ,那么my_truncate(value) == 2

    類似地,將整數值轉換為浮點類型,求值為最能代表原始整數值的浮點值。 例如, (float)425 == 425.0f (最后的f只是告訴float類型的值。如果在浮點值的末尾沒有f ,則它在C中的類型是double 。)

  5. “存儲表示”指的是值如何實際存儲在內存中。

  6. 鑄造類型雙關之間的區別是, 鑄造重新解釋的值本身,而是型雙關重新解釋如何值的存儲表示被解釋。

    因此,將整數值轉換為float類型只會產生最佳表示原始整數值的float; 但是,將一個整數值(與float大小相同)類型化為float意味着該整數值的存儲表示被視為浮點值的存儲表示形式,從而產生與原始值具有相同存儲表示的float值整數值有。

    同樣在另一個方向。 將浮點數類型化為無符號整數類型,將產生與原始浮點數具有相同存儲表示的無符號整數(以及因此位)。 這正是上面的float_bits()示例函數所做的。

  7. × 2 n , where either -1.0 < <= -0.5f or 0.5 <= < 1; 在C99及更高版本的C標准以及POSIXy C實現中,您可以使用frexpf()函數將float分割為標准化分數: ×2 n ,其中-1.0 < <= -0.5 f或0.5 <= <1; n是整數指數。
    如果需要,可以使用它來構造二進制值32可以在uint32_t表示的最接近值的表示。 這對於不使用IEEE 754 binary32 for float s的體系結構非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM