【问题标题】:How to use low byte and high byte of int16_t value? [duplicate]如何使用 int16_t 值的低字节和高字节? [复制]
【发布时间】:2019-06-26 14:10:01
【问题描述】:

我使用 Qt 串口通过串口发送命令。该命令包含一个带符号的 16 位整数 (xx),范围从 -4096 到 4096,高字节先发送。命令创建如下:

int16_t xi = 0;

for (int i=0; i<280; i++){
    xi = i;

    // index =     0   1   2  3   4   5
    // command = {'A','w','x','x','L','H'}
    unsigned char command[6] = {'A','w','x','x','L','H'};

    command[2] = xi >> 8;
    command[3] = xi & 0xFF;

    int len = strlen((char*)command);
    qDebug()<<"strlen: "<<len;
}

该命令适用于除 0 到 256 之间的所有值。我不明白为什么我会得到一个长度为 2 的字符串来表示 0 到 256 之间的值?我做错了什么?任何帮助表示赞赏。

编辑:我如何更改 command[2] = xi &gt;&gt; 8;(或其他部分)以避免截断并获取 -4096 和 4096 之间所有整数的完整命令?

【问题讨论】:

标签: c++ qt byte endianness


【解决方案1】:

根本问题在command[2] = xi &gt;&gt; 8; 部分。

当您将数组的第三个元素向右移动 8 位时,它变为 0 作为 int(空终止符)。在该操作之后,strlen 返回 2,因为第三个元素是空终止符。由于在 256 之后,向右移动 8 位不会使值变为 0,因此 strlen 按预期工作。但是,该行为是未定义的,因为 strlen 期望您的字符串以空值结尾。

【讨论】:

  • 除非数组中没有空值,否则行为是未定义的,因为strlen 要求输入是一个空终止的数组。
  • 错误。 char 通常是有符号类型,而有符号类型的右移通常是算术移位,因此在这种情况下,在 128 和 255 之间移动值不会产生 0
  • @phuclv 我在测试和调试代码后得出了这个结论。所以,没有错。
  • 调试可以帮助您了解在特定情况下会发生什么,而不是标准允许的所有内容。在这种情况下你很幸运,因为 xi
  • @eeroika 是的,完全正确。我忘了提及它,将修改答案。谢谢你。
猜你喜欢
  • 2011-08-30
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 2011-05-13
  • 2021-01-22
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
相关资源
最近更新 更多