【发布时间】:2022-01-22 10:12:31
【问题描述】:
我从通信中接收 2 个字节,然后我需要合并这 2 个值以获得 16 位值。
现在假设我期望收到数字 200,那么这两个字符是 a 和 b
char a=0x00;
char b=0xc8;
int cw = (a << 8) | b ;
printf("cw= %d\n",cw);
进行合并,变量 cw 变为 -56 而不是 200
如果我将 char 更改为 unsigned char 我得到了正确的值 200 我该如何解决?我希望收到正数和负数,当然还有数字 200
【问题讨论】:
-
首先,绝对使用
unsigned char来读取您正在阅读的字节。如果您可以假设发送和接收系统对负数使用相同的表示(这当然是一个安全的假设,因为它们几乎肯定都使用二进制补码),那么剩下的唯一问题是在这种情况下对负数进行符号扩展您机器上的整数大于 16 位。类似于if(cw & 0x8000) cw |= 0xffff0000;。 -
好的,感谢您的评论,我更改为 unsigned char,我的机器将 int 解释为 32 位,我将其更改为短(16 位),现在可以正常工作
-
等等。您希望能够处理 all 8 位有符号数字(例如 -128...127)和 值 200 吗?由于后者不在前者的范围内,并且您正在接收八位字节,那么您区分 -56 和 200 的计划是什么?听起来可能是这样,但我不会重复你的问题。我问的是不同的。如果您需要处理接收 -56(根据您的说法是可能的),与接收同样由八位字节表示的 200 相比,该八位字节是什么样的?
-
@WhozCraig:200 是将 0x00 放入有符号 16 位整数的高八位并将 0xc8 放入低八位的预期结果。
-
@WhozCraig 他正在接收 16 位,所以他应该没问题。 -56 是
ffc8,200 是00c8。
标签: arrays c bit-manipulation