【问题标题】:reorder a double type data重新排序双精度类型数据
【发布时间】:2019-06-25 05:43:36
【问题描述】:

我正在尝试在 Windows 中的 C 中创建一个函数,该函数具有双精度(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;
}

【问题讨论】:

  • 没有在 double 上定义移位。你需要找到另一个技巧。不过你的想法不错。
  • &amp;&amp; 是逻辑与运算符,而不是按位 AND 运算符。由于 0xFF 不为零,因此您将值 1 分配给 B0...B7

标签: c casting byte bit


【解决方案1】:

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

【讨论】:

  • 这里真的需要工会吗?如果处理字节级别的事情,您应该可以只使用 char 指针进行别名。
  • 您是否碰巧知道在标准中的哪个位置发现您无法通过 char 指针别名写入?
  • @ChristianGibbons 第 6.5p7 节讨论了如何访问对象。
  • 是的,@dbush,6.5/7 允许访问任何对象的存储值的方法之一是通过字符类型的左值。该标准中使用的术语“已访问”包括读取和写入,所以是的,您可以通过 char 指针修改对象的值。
  • 使用那段代码,我会得到改变字节顺序的输入值吗?后悔自己编程水平低,才编程3个月。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2019-10-19
相关资源
最近更新 更多