#include<iostream> using namespace std; int main() { unsigned char a=0xA5; unsigned char b=~a>>4+1; printf("b=%d\n",b); system("pause"); return 0; }
A.245 B.246 C.250 D.2
运行结果为 250。
这道题考查两个知识点:一是类型转换问题;而是运算符优秀级问题。
对于第一个问题:unsigned char b=~a>>4+1;编译器会把a和4先转换成int型,再进行计算。
然后将计算结果转换成unsigned char 赋值给b。
对于第二个问题:因为“~”的优先级高于>>的优先级,故先对1010 0101取反 01011010,再右移。因为+的优先级高于>>,故
先加再位移。于是0101 1010 右移5位结果是00000010.
最后的结果应该是2才对,但是把如上的指令放到vs2008中运行,答案居然是250.
那么到底是什么地方出了问题?在调试的过程中进入汇编指令。可以看到高级语句转换为汇编语言以后,是先执行取反再位移的。
我们看到eax是16位的寄存器,于是机器中0xA5的寄存中表达是0000 0000 1010 0101 ,取反是1111 1111 0101 1010,
那么右移5位是0000 0111 1111 1010,由于是unsigned char型的只能表示第8位的数组,即250.