使用C中的union将双精度浮点数分解为字节

时间:2011-11-09 21:53:27

标签: c types unions

我是C编程的新手,所以请原谅任何编码失误等等。

我有一个联合定义,如下所示:

union meh {
    double foo;
    char bar[8];
};

然后我做这样的事情:

meh firstOne;
meh otherOne;

char blah[8];
double whatever;

firstOne.foo = 0.12345;
blah = firstOne.bar;

otherOne.bar = blah;
whatever = otherOne.foo;

我想弄清楚的是:'不管'等于0.12345吗?

(只是澄清 - sizeof(double)在我的机器上是8个字节 - 不知道到处都是真的。)

我知道显而易见的事情就是运行它并尝试自己,但不幸的是我无法做到这一点。我也对代码背后的机制感兴趣。

非常感谢您的时间和帮助 - 非常感谢!

编辑:从目前为止的评论来看,我看起来像个白痴和

blah = firstOne.bar;

应该是

strcpy(blah, firstOne.bar);

代替。对不起!

3 个答案:

答案 0 :(得分:3)

是的,如果你修正错误,whatever将是0.12345。如果你自己测试一下,这里有一些去了化的示例代码:

#include <assert.h>
#include <string.h>

// use more descriptive names
union d2b
{
    double value;
    char bytes[sizeof (double)]; // avoid magic numbers
};

int main(void)
{
    const double TEST_VALUE = 0.12345;

    // don't omit the union keyword in C (not necessary in C++)
    union d2b src, dest;
    src.value = TEST_VALUE;

    // arrays are not lvalues, ie you can't assign to array variables
    // use memcpy() instead of strcpy() for arbitrary binary data
    memcpy(dest.bytes, src.bytes, sizeof dest.bytes);

    // assert, the foundation of test-driven development in C
    assert(dest.value == TEST_VALUE);

    return 0;
}

答案 1 :(得分:2)

我认为blah = firstOne.bar不会编译 - 你试图复制一个它不喜欢你做的整个数组。您需要使用memcpy来复制所有数组数据。但是你说DID这样做(在两个地方你都试图复制char数组),我会说whatever 最终等于0.12345。

答案 2 :(得分:0)

制作:

union meh {
    double foo;
    char bar[ sizeof(double) ];
};