我希望下面的代码将输出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;
}
答案 0 :(得分:28)
C在对其执行操作之前将uint8_t
提升为int
。所以:
port
被提升为有符号整数0x0000005a
。~
将其取反,得到0xffffffa5
。0xfffffffa
。uint8_t
,得到0xfa == 250
。要解决此问题,请截断临时结果:
uint8_t result_8 = (uint8_t)(~port) >> 4;
屏蔽它:
uint8_t result_8 = (~port & 0xff) >> 4;
或对其进行xor(感谢@Nayuki!):
uint8_t result_8 = (port ^ 0xff) >> 4;