zoukankan      html  css  js  c++  java
  • 类型转换、运算符问题

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

  • 相关阅读:
    零点起飞学Word与Excel高效办公实战与技巧
    C语言核心技术(原书第2版)
    完全精通Nuendo电脑音乐及音频制作:精细操作与实践指南
    1035.找出直系亲属(floyd)
    1033.继续XXX定律
    1034.寻找大富翁
    1032.ZOJ问题
    1029.魔咒词典
    1031.XXX定律
    1028.继续畅通工程
  • 原文地址:https://www.cnblogs.com/yanglf/p/2751365.html
Copyright © 2011-2022 走看看