2015-06-18 82 views
0

可以訪問C中的浮點常量的位表示;C中的浮點常量,位表示

例如,我想分配

uint64_t x = //bit representation of 5.74; 

這是由 0x40b7ae14

你是否認爲這是可能的代表?實現這一目標的

+0

'uint64_t x = 0x40b7ae14;'將工作。 – Joshpbarron

+0

'float x = 5.74; uint32_t y; memcpy(&y,&x,sizeof(y)); '請注意,'float'通常是32位,而不是64. – EOF

+0

是的,我知道......但我的問題是如果可以直接說「推斷0x ...從5.74」。 – user8469759

回答

5

一種方法是使用工會:

union { 
    double fltValue; 
    uint64_t uintValue; 
} conversion; 

conversion.fltValue = 5.74; 
printf("%#llx\n", conversion.uintValue); 

更新了%#x感謝Aracthor爲提它。感謝EOF和%#llx

對於工作示例(與float代替double)看到:

https://ideone.com/p4rH5l

+1

當您打印64位數字時,您的'printf()'錯誤,它需要''%#「PRIx64」\ n「'。 – EOF

+0

@SergeBallesta我在C標準(C11)中尋找了這個限制,並沒有找到它,它可能是我查看了錯誤的地方,但我認爲它已從標準中刪除。儘管如此,我仍然聽取您的意見。 –

+1

更改每個EOF的評論之前的評論。摘錄自C99草案6.2.6.1:*當值存儲在聯合類型對象的成員中時,對象 表示的字節與該成員不對應,但對應於其他成員 取未指定的值*。它不明確UB,因此不應該優化,但C沒有指定其他成員的值。 –

3

這是可能的,但不是移植的,因爲你不能確定的浮點值是如何表示的: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 *

1
#include <stdint.h> 
#include <stdio.h> 

int main(void) { 
    double x = 5.74; 
    uint64_t y = *((uint64_t*)&x); 
    printf("0x%016llx", y); /* 0x4016f5c28f5c28f6 */ 
} 
+0

只有代碼答案是不滿意的。請詳細解釋您的代碼如何解決OP的問題。 –

0

如果你所要求的浮動的二進制表示,然後採取pointer..assign浮動變量整數指針的地址,並通過derefenencing INT指針的值的整數,得到它的二進制形式。 。在中間如果你想避免由不尋常的類型轉換產生的警告,那麼你總是可以使用void *