#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.

 

posted on 2012-11-02 15:38  吉大依恋  阅读(367)  评论(0编辑  收藏  举报