изменить порядок данных двойного типа - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь создать функцию в C в Windows, которая имеет в качестве входного значения double (8 байт) и возвращает еще один двойной, но переставленный, то есть вход B7 ... B0, а вывод B0 ...B7.Мой компилятор выдает ошибку при работе с int и double данными.

Я думал о том, чтобы взять входное значение и создать маски с байтом высокого уровня (0xFF) и, таким образом, отделить 8 байтов, которые образуют двойное входное значение,затем объедините их в порядке, отличном от того, в котором они были введены, и получите мой двойной вывод, упорядоченный так, как я хочу, но он не работает.

Код следующий:

double ordena_lineal(double lineal)
{

    // Recibo B7...B0 y devuelvo B0...B7
    uint8_t B0,B1,B2,B3,B4,B5,B6,B7;
    double lineal_final;

    B0 = lineal&&0xFF;
    B1 = (lineal>>8)&&0xFF;
    B2 = (lineal>>8*2)&&0xFF;
    B3 = (lineal>>8*3)&&0xFF;
    B4 = (lineal>>8*4)&&0xFF;
    B5 = (lineal>>8*5)&&0xFF;
    B6 = (lineal>>8*6)&&0xFF;
    B7 = (lineal>>8*7)&&0xFF;

    lineal_final = (B7 | (B6 << 8) | (B5 << 8*2) | (B4 << 8*3) | (B3 << 8*4) | (B2 << 8*5) | (B1 << 8*6) | (B0 << 8*7))
    return lineal_final;
}

1 Ответ

0 голосов
/ 31 января 2019

Битовые операторы недопустимы для использования с типами с плавающей запятой.Кроме того, когда вы присваиваете смещенные байты обратно lineal_final, вы присваиваете значение этого выражения, а не его представление .

Вам необходимо использоватьunion, чтобы делать то, что вы намерены.

union double_bytes {
    double d;
    uint8_t b[sizeof(double)];
};

double ordena_lineal(double lineal)
{
    union double_bytes src, dst;
    src.d = lineal;

    for (int i = 0; i < sizeof(double); i++) {
        dst.b[sizeof(double) - 1 - i] = src.b[i];
    }

    return dst.d;
}

Это позволяет вам получить доступ к объектному представлению double и выполнять псевдонимы стандартным образом.

...