重新排序双精度型数据

时间:2019-01-31 17:24:33

标签: c casting byte bit

我正在尝试在Windows中的C语言中创建一个函数,该函数具有输入double(8字节)并返回另一个double但已重新排列的功能,即输入为B7 ... B0,输出为B0 ... B7。使用int和double数据时,我的编译器给我一个错误。

我考虑过使用输入值并使用高电平字节(0xFF)制作掩码,因此将构成双精度输入值的8Bytes分开,然后以除其输入顺序之外的其他顺序将其串联起来,并得到双精度输出按我的要求排序,但不起作用。

代码如下:

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 :(得分:0)

按位运算符在浮点类型上使用是非法的。另外,当您将移位后的字节分配回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的对象表示并以符合标准的方式执行别名。