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.

  • 相关阅读:
    娃娃机 解题报告
    ecshop
    多字节字符串 函数
    电商中设置满包邮,满减等促销搞活动;电商平台同步到第三方,日志记录
    PHP文件操作
    apache重写字段详细说明
    httpc服务器错误类型大全
    正则入门简易
    php100 编程小技巧
    memcache
  • 原文地址:https://www.cnblogs.com/yanglf/p/2751365.html
Copyright © 2011-2022 走看看