Разложение чисел с плавающей запятой двойной точности с использованием объединения в C - PullRequest
1 голос
/ 10 ноября 2011

Я довольно новичок в программировании на 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?- Не знаю, так ли это везде.)

Я знаю, что очевидная вещь, которую нужно сделать, это просто запустить ее и попробовать себя, но, к сожалению, я не в состоянии сделать это.Я также интересуюсь механикой кода здесь.

Большое спасибо за ваше время и помощь - это очень ценится!

РЕДАКТИРОВАТЬ: Из комментариев пока, похоже, яЯ идиот и

blah = firstOne.bar;

должен быть

strcpy(blah, firstOne.bar);

вместо этого.Извините за это!

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Да, 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;
}
2 голосов
/ 10 ноября 2011

Я не думаю, что blah = firstOne.bar скомпилирует - вы пытаетесь скопировать весь массив, что вам не понравится.Вам нужно будет использовать memcpy для копирования всех данных массива.Но говоря, что вы ДЕЛАЛИ это (в обоих местах вы пытаетесь скопировать массив символов), я бы сказал, что whatever будет в конечном итоге равным 0,12345.

0 голосов
/ 10 ноября 2011

Сделать так:

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