前几天看到一段代码,该代码的实际输出结果和理解的不一致,调试后发现是寄存器导致的。代码如下:
#include <iostream>
using namespace std;
int main()
{
unsigned char a = 0xA5;
usigned char b = ~a>>4+1; //这里是先按位取反,再计算4+1,最后移位
printf("b=%d\n", b);
return 0;
}
个人的理解:
a的二进制为:1010 0101
按位取反:0101 1010
右移5位:0000 0010
即:b=2
代码运行实际输出
b=250
不一致原因
计算时,a被保存在了一个大于8位的寄存器中。
例如32位寄存器中。
按位取反得到的结果可能就是1111 1111 1111 1111 1111 1111 0101 1010
右移5位:0000 0111 1111 1111 1111 1111 1111 1010
最后赋值给b时,进行截断,只取 1111 1010, 即 250