如何在C中获取double的二进制?

时间:2013-05-09 10:44:48

标签: c bit-manipulation

对于char或int,我可以这样做:

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");
}

但是对于double,我不能使用operator&amp;。

我不能使用reinterpret_cast(它是C ++)。

然后,怎么做?

4 个答案:

答案 0 :(得分:1)

创建char指针并使其指向此double。使用您的函数打印第一个sizeof(双)字符。

答案 1 :(得分:1)

使用union而不是memcpypointer的解决方案:

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(" ");
    }
}

答案 2 :(得分:1)

假设double有64位,这会将double x的字节重新解释为无符号的64位整数:

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

这是合法的C,double的字节与实现有关。它定义了一个复合文字,它是一个联合,用double初始化联合,并访问uint64_t成员。 C标准表示当访问最后存储成员以外的成员时,字节将被重新解释为新类型。

答案 3 :(得分:1)

根据@Daniel Fischer的评论,

使用memcpy()进行简单的实施:

#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
        );
        }
}

,和指针一样(省略char数组和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
        );
        }
}