C 按位求反后右移的意外结果
我希望下面的代码将输出C 按位求反后右移的意外结果,c,bit-manipulation,C,Bit Manipulation,我希望下面的代码将输出10,因为(~port)等于10100101 因此,当我们将其右移4时,我们得到00001010,即10。 但是输出是250!为什么? int main() { uint8_t port = 0x5a; uint8_t result_8 = (~port) >> 4; //result_8 = result_8 >> 4; printf("%i", result_8); return 0; } 在对其执
10
,因为(~port)
等于10100101
因此,当我们将其右移4
时,我们得到00001010
,即10
。
但是输出是250
!为什么?
int main()
{
uint8_t port = 0x5a;
uint8_t result_8 = (~port) >> 4;
//result_8 = result_8 >> 4;
printf("%i", result_8);
return 0;
}
在对其执行操作之前,C将
uint8\u t
升级为int
。因此:
端口
升级为有符号整数0x0000005a
~
将其反转为0xffffffa5
0xfffffffa
uint8\u t
giving0xfa==250
uint8_t result_8 = (uint8_t)(~port) >> 4;
掩盖它:
uint8_t result_8 = (~port & 0xff) >> 4;
或者xor(谢谢@Nayuki!):
你说得对,但我认为C不仅提升了
uint8\t
,而且提升了unsigned char
,因为我也用unsigned char
测试了它,得到了相同的结果!我说的对吗?uint8\u t
很可能是系统上的无符号字符的同义词。升级规则适用于小于int
的所有整数类型。或者仅显式翻转低位8位:result=(端口^0xFF)>>4代码> C++也这么做吗?看见
uint8_t result_8 = (port ^ 0xff) >> 4;