题:
#include <iostream>
using namespace std;
int main()
{
unsigned char a = 0xA5;
unsigned char b = ~a>>4 + 1;
printf("b = %d\n",b);
return 0;
}
A.245 B.246 C.250 D.2
求输出:
我的第一遍求解:
a = 0xA5 10100101
取反
01011010
右移4位
00000101
在加1
00000110
结果: 6
哇哦,这没答案呀。算错了?想了半天没整明白,只好看答案了。看了之后,拍拍小脑袋,还得努力呀。答案的结果是250,说是在VS2008上测试的结果,
然后,我把代码用gcc调试了一下也是250。
总结一下思路:这个题目涉及到两个关键点(1),隐式的类型转换问题。(2),运算符的优先级问题。
表达式: b = ~a>>4 + 1;
首先,要进行隐式的类型转换,a转换为int型。 (所谓的整数提升)
运算符的优先级为 ~ 大于 + 大于 >>
所以运算顺序为:
a = 00000000 00000000 00000000 10100101
取反
11111111 11111111 11111111 01011010
计算 +
4 + 1 = 5
a右移5位
00000111 11111111 11111111 11111010
赋值给b,发生截断
b = 11111010 = 250