我希望下面的代码会输出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_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;
或异或它(谢谢@Nayuki!
uint8_t result_8 = (port ^ 0xff) >> 4;