2013-08-16 90 views
6

我想將例如2.45的浮點數轉換爲4字節的char數組。 所以2.45應該是這樣的'@' 'FS' 'Ì' 'Í'這是二進制ieee代表2.45 = 01000000 00011100 11001100 11001101如何將float轉換爲C中的4字節char?

我已經解決了這個問題,但它的複雜性很差。你有什麼好主意嗎?

感謝您的好答案。

你能告訴我從char數組返回到浮點數的方式嗎?

+2

'char a [sizeof the_float]; memcpy(char_array,&the_float,sizeof the_float)'? – 2013-08-16 10:17:32

+2

''Ì''和''Í''只是一個字符集中'11001100 11001101'的表示。 – glglgl

回答

7

你必須這樣做,包括這兩者的幾種方法:

  1. 使用類型轉換和指針:

    float f = 2.45; 
    char *s = (char *) &f; 
    

    注意,這是不以任何方式安全在「字符串」之後沒有字符串終止符。

  2. 使用union

    union u 
    { 
        float f; 
        char s[sizeof float]; 
    }; 
    
    union u foo; 
    foo.f = 2.45; 
    

    的字符數組現在可以訪問得到的字節值。還要注意,像第一個替代方案一樣,沒有字符串終止符。

+0

「這實際上是利用未定義的行爲」 - 你可以進一步解釋一下嗎? – Jimbo

+2

''memcpy()'優於你的兩種方法。 (順便說一句,只要別名指針是(有符號或無符號)'char *',第一個方法就是「安全」的,第二種方法也不會調用UB。 – 2013-08-16 10:24:45

+0

@Jimbo記住所有' union'共享相同的內存,這意味着你只能可靠地獲得最後一個成員的值,如果我在我的例子中設置了'f'成員,那麼我應該只有'f',直到我設置了另一個成員。 –

13

只是使用memcpy:

#include <string.h> 

float f = 2.45f; 
char a[sizeof(float)]; 

memcpy(a, &f, sizeof(float)); 

如果您需要相反的字節順序則是扭轉a字節之後,例如一件小事

int i, j; 

for (i = 0, j = sizeof(float) - 1; i < j; ++i, --j) 
{ 
    char temp = a[i]; 
    a[i] = a[j]; 
    a[j] = temp; 
} 
+0

以及如何更改排序? – 12oni

+1

@ 12oin'tmp = a [0]; a [0] = a [3]; a [3] = tmp; TMP = A [1]; a [1] = a [2]; a [2] = tmp;'改變序號。 – nos