可以訪問C中的浮點常量的位表示;C中的浮點常量,位表示
例如,我想分配
uint64_t x = //bit representation of 5.74;
這是由 0x40b7ae14
你是否認爲這是可能的代表?實現這一目標的
可以訪問C中的浮點常量的位表示;C中的浮點常量,位表示
例如,我想分配
uint64_t x = //bit representation of 5.74;
這是由 0x40b7ae14
你是否認爲這是可能的代表?實現這一目標的
一種方法是使用工會:
union {
double fltValue;
uint64_t uintValue;
} conversion;
conversion.fltValue = 5.74;
printf("%#llx\n", conversion.uintValue);
更新了%#x
感謝Aracthor爲提它。感謝EOF和%#llx
。
對於工作示例(與float
代替double
)看到:
當您打印64位數字時,您的'printf()'錯誤,它需要''%#「PRIx64」\ n「'。 – EOF
@SergeBallesta我在C標準(C11)中尋找了這個限制,並沒有找到它,它可能是我查看了錯誤的地方,但我認爲它已從標準中刪除。儘管如此,我仍然聽取您的意見。 –
更改每個EOF的評論之前的評論。摘錄自C99草案6.2.6.1:*當值存儲在聯合類型對象的成員中時,對象 表示的字節與該成員不對應,但對應於其他成員 取未指定的值*。它不明確UB,因此不應該優化,但C沒有指定其他成員的值。 –
這是可能的,但不是移植的,因爲你不能確定的浮點值是如何表示的:C標準沒有定義它。
你可以簡單地使用指針的鑄造:
float x = 5.74;
void *pt = &x
uint64_t *ip = pt;
uint64_t i = *ip;
這是正式的不確定的行爲,因爲你把指針轉換爲不同的類型,因爲你加尾數問題,浮點你不應該這樣做表示。
正確的方法是:
float x = 5.74;
void *pt = &x
unsigned char *ip = pt;
ip
現在指向含有浮標的二進制表示大小sizeof(float)
的unsigned char[]
。並且不會調用未定義的行爲,因爲始終允許將指針指向void *
或char *
。
#include <stdint.h>
#include <stdio.h>
int main(void) {
double x = 5.74;
uint64_t y = *((uint64_t*)&x);
printf("0x%016llx", y); /* 0x4016f5c28f5c28f6 */
}
只有代碼答案是不滿意的。請詳細解釋您的代碼如何解決OP的問題。 –
如果你所要求的浮動的二進制表示,然後採取pointer..assign浮動變量整數指針的地址,並通過derefenencing INT指針的值的整數,得到它的二進制形式。 。在中間如果你想避免由不尋常的類型轉換產生的警告,那麼你總是可以使用void *
'uint64_t x = 0x40b7ae14;'將工作。 – Joshpbarron
'float x = 5.74; uint32_t y; memcpy(&y,&x,sizeof(y)); '請注意,'float'通常是32位,而不是64. – EOF
是的,我知道......但我的問題是如果可以直接說「推斷0x ...從5.74」。 – user8469759