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.

  • 相关阅读:
    redis中文API
    基于redis的分布式锁
    redis安装使用配置
    windows常用命令
    curl命令详解
    linux远程连接
    memcache在大型网站的应用策略
    缓存使用的一些注意事项
    记录memcache分布式策略及算法
    U盘安装Centos7.0图解
  • 原文地址:https://www.cnblogs.com/yanglf/p/2751365.html
Copyright © 2011-2022 走看看