2013-05-09 122 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标准规定,当访问最后存储的成员以外的成员时,字节将被重新解释为新类型。

相关问题