2014-09-24 249 views
1

我正在處理從一個平臺到另一個浮點數的32位浮點數。那麼它只允許將16位unsinged int成員傳遞給transfter寄存器。我在想,我可以將32位浮點數分成兩個16位,然後再轉換到另一側的32位。將一個32位浮點數轉換爲兩個16位浮點數,然後再轉換回該32位浮點數

(我用C語言)

喜歡:

float A = 3.14 
uint16_t B = A & 0xffff; 
uint16_t C = A & 0xffff0000; 

float D = C<<16 & B; 

Obevious這是不正確的當它被分配的浮點數據將被轉換爲無符號整型。那我通常怎麼做呢?應當有一些比較成熟的方法來做similiar事情

感謝

+0

只是提一些關鍵字,如果你想要做一些進一步的研究:這就是所謂的類型 - 打算或重新解釋。 – mafso 2014-09-24 11:25:04

回答

5

可以使用工會對於這一點,如:

typedef union { 
    float f; 
    uint16_t a[2]; 
} U; 

U u; 

u.f = 3.14f; 

printf("%g -> %#x %#x\n", u.f, u.a[0], u.a[1]); 

LIVE DEMO

注:嚴格來說,這是不確定的行爲,但這是一種廣泛使用的技術,不可能失敗。或者你可以採取一個更安全,但可能稍差有效的方法,只是使用memcpy,這樣的:

float f = 3.14f; 
uint16_t a[2]; 
memcpy(a, &f, sizeof(a)); 
printf("%g -> %#x %#x\n", f, a[0], a[1]); 

LIVE DEMO

+1

儘管這是常用的,但它是未定義的行爲來讀取另一個聯合成員比寫的。 – 2014-09-24 08:52:14

+0

@vlad_tepesch:是的,謝謝,只是給這個答案添加一個關於這個的註釋。 – 2014-09-24 08:55:00

+2

也許最好使用中間uint32_t並手動掩蓋/合併16位碎片以幫助解決字節順序差異。畢竟,這個號碼正在「平臺」之間轉移。 – doynax 2014-09-24 09:16:13

相關問題