[英]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。 我相信這部分是由於在這種類型轉換過程中丟失了比特,而這些比特是通過指針轉換保留的,但更詳細的解釋將非常受歡迎。
在當前的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; }
大多數當前架構使用IEEE-754 binary32格式用於float
類型,但不是全部。 如果您的程序假定這一點,則應在文檔中說明。
我個人喜歡在編譯時檢查它,如果我的代碼無法應對,則編譯失敗。
大多數當前體系結構對整數和浮點類型使用相同的字節順序( 字節順序 ),但不是全部。 同樣,如果您的程序假定這一點,它應該在文檔中說明,或者在編譯時檢查它(例如,在同一個項目中使用單獨的測試程序)。
在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
。)
“存儲表示”指的是值如何實際存儲在內存中。
鑄造和類型雙關之間的區別是, 鑄造重新解釋的值本身,而是型雙關重新解釋如何值的存儲表示被解釋。
因此,將整數值轉換為float類型只會產生最佳表示原始整數值的float; 但是,將一個整數值(與float
大小相同)類型化為float
意味着該整數值的存儲表示被視為浮點值的存儲表示形式,從而產生與原始值具有相同存儲表示的float值整數值有。
同樣在另一個方向。 將浮點數類型化為無符號整數類型,將產生與原始浮點數具有相同存儲表示的無符號整數(以及因此位)。 這正是上面的float_bits()
示例函數所做的。
× 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.