2013-05-09 46 views
1

對於char或整型,我可以這樣做:如何獲得C中雙精度的二進制數?

void print2(char c)//print char c in binary 
{ 
    for(int i=7;i>=0;i--) 
     if ((1<<i)&c) printf("1"); 
     else printf("0"); 
} 

但對於雙I不能使用運營商&。

我無法使用reinterpret_cast(它是C++)。

那麼,該怎麼做?

+8

'它memcpy'到一個'unsigned char [sizeof(double)]'。 – 2013-05-09 10:47:54

+0

@DanielFischer酷。 – Sayakiss 2013-05-09 10:48:47

+0

memcpy?我從來不知道它。聽起來不錯。 @DanielFischer謝謝。 – Buddha 2013-05-09 10:56:36

回答

1

樸素執行與memcpy(),按費歇爾@Daniel的評論:

#include <stdio.h> 
#include <string.h> 
#include <limits.h> 

void double_to_bits(double val); 

int main(void) 
{ 
unsigned idx; 

double vals[] = { -1.0, 0.0, 1.0, 2.0 }; 

for (idx = 0; idx < 4; idx++) { 
     printf("\nvals[%u]= %+lf-->>", idx, vals[idx]); 
     double_to_bits(vals[idx]); 
     } 
printf("\n"); 

return 0; 
} 

void double_to_bits(double val) 
{ 
unsigned idx; 
unsigned char arr[sizeof val]; 

memcpy (arr, &val, sizeof val); 

for (idx=CHAR_BIT * sizeof val; idx-- ;) { 
     putc(
     (arr[idx/CHAR_BIT] & (1u << (idx%CHAR_BIT))) 
     ? '1' 
     : '0' 
     , stdout 
     ); 
     } 
} 

,並用指針相同的(省略字符陣列和所述的memcpy)

void double_to_bits2(double val) 
{ 
unsigned idx; 
unsigned char *ptr = (unsigned char*) &val; 

for (idx=CHAR_BIT * sizeof val; idx-- ;) { 
     putc(
     (ptr[idx/CHAR_BIT] & (1u << (idx%CHAR_BIT))) 
     ? '1' 
     : '0' 
     , stdout 
     ); 
     } 
} 
1

創建字符指針並使其指向這個double。使用你的函數打印第一個sizeof(double)字符。

1

union而非memcpypointer A液:

void print2(double x)//print double x in binary 
{ 
    union { 
     double x; 
     char c[sizeof(double)]; 
    } u; 

    assert(sizeof(char) == 1); 

    u.x = x; 

    for (unsigned ofs = 0; ofs < sizeof(double); ofs++) { 
     for(int i = 7; i >= 0; i--) { 
      printf(((1 << i) & u.c[ofs]) ? "1" : "0"); 
     } 
     printf(" "); 
    } 
} 
+4

LOL @'assert(sizeof(char)== 1);'無價! – wildplasser 2013-05-09 11:18:14

+0

確實無價。那是什麼意思? – 2013-05-09 14:59:07

1

。假定一個double具有64位,這重新解釋一個double x的字節爲一個無符號的64位整數:

(union { double d; uint64_t u; }) {x} .u; 

這是合法的C,其中double的字節取決於實現。它定義了一個聯合的複合字面值,初始化與double的聯合,並訪問uint64_t成員。 C標準規定,當訪問最後存儲的成員以外的成員時,字節將被重新解釋爲新類型。

相關問題