C++ 连接按位操作的正确方法?

C++ 连接按位操作的正确方法?,c++,C++,Im需要连接一些位操作,但当前输出似乎是错误的。拆分操作与此类似: unsigned char a = 0x12 unsigned char x = 0x00; x = a << 4; x = x >> 4; 无符号字符a=0x12 无符号字符x=0x00; x=a>4; 预期结果x=0x02; 当前结果x=0x02 如果我尝试连接操作,则结果不正确: unsigned char a = 0x12 unsigned char x = 0x00; x = (a <

Im需要连接一些位操作,但当前输出似乎是错误的。拆分操作与此类似:

unsigned char a = 0x12
unsigned char x = 0x00;
x = a << 4;
x = x >> 4;
无符号字符a=0x12
无符号字符x=0x00;
x=a>4;
预期结果x=0x02; 当前结果x=0x02

如果我尝试连接操作,则结果不正确:

unsigned char a = 0x12
unsigned char x = 0x00;
x = (a << 4) >> 4;
无符号字符a=0x12
无符号字符x=0x00;
x=(a>4;
预期结果x=0x02; 当前结果x=0x12

提前感谢您的建议。

无符号字符a=0x12;
   unsigned char a = 0x12;
   unsigned char x = 0x00;
   x = static_cast<unsigned char>(a << 4) >> 4;   
无符号字符x=0x00; x=静态铸件(a>4;
问题是
(4
基本上是
0x12


请参阅

编译器未对>>和4应用积分升级; 将使用字节范围的寄存器进行操作,但编译器在执行移位之前将字符a提升为int,保留向左移位的位

您可以通过执行以下操作来解决此问题:

x = ((a << 4) & 0xff) >> 4;
x=((a>4;

同样,问题是积分提升将保留位,直到最后一次转换。

你所说的“串联”是什么意思?你期望得到什么?
a>4
的结果,即
x=static\u cast(a>4;
。这是我的想象,还是您执行了一个操作,撤消了该操作,然后期望它输出与原始操作不同的内容。这里有一些很好的答案,所以我可能遗漏了一些内容。您(或任何人)可以吗解释为什么你认为它与
0x12
?@Chipster
0x12@kmdreko不同啊,因为理论上它只是一个字符。明白了。现在有道理了。请注意,这里的问题不是编译器没有做任何事情。问题是编写此代码的人的期望没有实现根据C++语言的规则,内置的操作数<代码> >代码>代码>谢谢你的解释,是的,我不知道积分提升。@ chpiste的意思是:他希望char是8位,<代码>谢谢你Martin m的解释。我会用你的解决方案。ED下8位,即使在8位机器上,也会违反C++语言的规则,具体地说,…
x = ((a << 4) & 0xff) >> 4;