C++ 连接按位操作的正确方法?
Im需要连接一些位操作,但当前输出似乎是错误的。拆分操作与此类似: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 <
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
?@Chipster0x12@kmdreko不同啊,因为理论上它只是一个字符。明白了。现在有道理了。请注意,这里的问题不是编译器没有做任何事情。问题是编写此代码的人的期望没有实现根据C++语言的规则,内置的操作数<代码> >代码>代码>谢谢你的解释,是的,我不知道积分提升。@ chpiste的意思是:他希望char是8位,<代码>谢谢你Martin m的解释。我会用你的解决方案。ED下8位,即使在8位机器上,也会违反C++语言的规则,具体地说,…
x = ((a << 4) & 0xff) >> 4;