Isl*_*een 21 c bit-manipulation
我期望下面的代码将输出,10因为它(~port)等于10100101
So,当我们右移它时,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;
}
Run Code Online (Sandbox Code Playgroud)
ybu*_*ill 28
C 在对其进行操作之前uint8_t升级int为。所以:
port被提升为有符号整数0x0000005a。~颠倒它的付出0xffffffa5。0xfffffffa。uint8_t礼物0xfa == 250。要解决此问题,请截断临时结果:
uint8_t result_8 = (uint8_t)(~port) >> 4;
Run Code Online (Sandbox Code Playgroud)
遮盖它:
uint8_t result_8 = (~port & 0xff) >> 4;
Run Code Online (Sandbox Code Playgroud)
或xor(感谢@Nayuki!):
uint8_t result_8 = (port ^ 0xff) >> 4;
Run Code Online (Sandbox Code Playgroud)