如何使用int16_t值的低字节和高字节?



我使用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 >> 8;(或其他部分)以避免截断并获得 -4096 和 4096 之间所有整数的完整命令?

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

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

最新更新