对字符数组中的元素执行逐位操作

Bitwise operations on elements from array of chars

本文关键字:执行 位操作 元素 字符 数组      更新时间:2023-10-16

我已经制作了一个十六进制数字数组,我想按位将其相加。在我的程序中,我想用0x7F00添加0xFF。这是我的方法

#include <iostream>
using namespace std;
int main() {
char data[2] = {0xFF, 0x7F};
cout << (data[0] | (data[1] << 8)) << endl;
system("pause");
return 0;
}

我希望结果是0x7FFF,十进制为32767,但我得到了-1(十六进制为0xFF(。

您遇到的问题源于两个事实:

  1. 按位运算符需要对两个操作数进行积分提升
  2. char可以是有符号的也可以是无符号的

Promotion将较小类型的值(如charshort(转换为int,并且作为其中的一部分,已签名的值将进行符号扩展。如果对char进行了签名,则值0xff将转换为(32位(int0xffffffff,即-1

无论您在逐位OR中使用什么值,结果仍然是0xffffffff

简单的解决方案是明确使用unsigned char(甚至更好的uint8_t(作为阵列元素的类型:

uint8_t data[2] = {0xFF, 0x7F};