• 使用C/C++,赋值运算时发生的转换


    使用C/C++,赋值运算时发生的转换主要有以下四种情况

    一: 两边类型不同;

      结果: 自动完成类型转换!

    二: 长数赋给短数;

      结果: 截取长数的低位送给短数

    三: 短数赋给长数;

      结果: 原来是什么数,现在还是什么数!

    四: 符号位的赋值处理;

      结果: 直接处理,不管符号位还是数字位;

    #--------------------------------------------------------------------------------------------------------------------------#

    第一种情况:两边类型不同

    这种情况最为常见,大家应该都已经遇到过。

    举例:

    #include<iostream>
    using namespace std;
    
    int main()
    {
      int int_i = 64.14159;     //int_i = 64
      char char_i = int_i;      //char_i = '@' 
      float float_i = char_i;   //float_i = 64
      bool bool_i = float_i;    //bool_i = 1
      cout << showpoint << int_i <<" "<< char_i <<" "<< float_i <<" "<< bool_i << endl;
      //输出:64 @ 64.0000 1
      return 0;
    }

    第二种情况:长数赋给短数

    截取长数的低n位给短数!这种情况特别容易出错

    举例:

    #include<iostream>
    #include<bitset>
    #include<iomanip>
    using namespace std;
    
    int main()
    {
      int int_i = 865;     
      char char_a = int_i;
      cout << int_i << endl;
      cout << char_a << endl;
      //输出:865
      //     a  
      
      bitset<sizeof(int)*8> bin_i(int_i);  //将int_i以二进制形式输出
      bitset<sizeof(char)*8> bin_a(char_a);//将char_a以二进制形式输出
      cout << setw(32) << bin_i << endl; 
      cout << setw(32) << bin_a << endl;  
      //输出:00000000000000000000001101100001
      //                             01100001
      
      return 0;
    }

    由于char 类型只占1个byte(8 bits), 而int 类型占4个byte(32 bits)(int 在有些环境可能是2个byte), 故char_a 只得到了int_a 的末八位的值! 

    第三种情况:短数赋给长数

    这种情况最简单,原来是什么数,现在还是什么数。

    举例:

    #include<iostream>
    #include<bitset>
    #include<iomanip>
    using namespace std;
    
    int main()
    {
      short short_i = 123;     
      long long_i = short_i;
      cout << short_i << endl;
      cout << long_i << endl;
      //输出:123
      //     123  
      
      bitset<sizeof(short)*8> bin_short_i(short_i); //将short_i以二进制形式输出
      bitset<sizeof(long)*8> bin_long_i(long_i);    //将long_i以二进制形式输出
      cout << setw(32) << bin_short_i << endl; 
      cout << setw(32) << bin_long_i << endl;  
      //输出:                0000000001111011
      //     00000000000000000000000001111011
      
      short short_j = -123;     
      long long_j = short_j;
      cout << short_j << endl;
      cout << long_j << endl;
      //输出:-123
      //     -123  
      
      bitset<sizeof(short)*8> bin_short_j(short_j); //将short_j以二进制形式输出
      bitset<sizeof(long)*8> bin_long_j(long_j);    //将long_j以二进制形式输出
      cout << setw(32) << bin_short_j << endl; 
      cout << setw(32) << bin_long_j << endl;  
      //输出:                1111111110000101
      //     11111111111111111111111110000101
      
      return 0;
    }

    这里需要注意的是

    如果short型数为无符号数,则long型的高16位补0;

    如果short型数为有符号数:

    • 当short型最高位为0时,long型的高16位补0;
    • 当short型最高位为1时,long型的高16位补1;当然这是为了保证long型的值与short型的值相同,因为负数存的是补码,求值方法是反码+1;

    第四种情况:符号位的赋值处理

    这种情况也好处理,不管符号位还是数字位,都直接赋值!

    举例:

    #include<iostream>
    #include<bitset>
    #include<iomanip>
    using namespace std;
    
    int main()
    {
      unsigned int unsigned_int_i = 0xAAAAAAAA;
      signed int signed_int_j = unsigned_int_i;
      cout << unsigned_int_i << endl;
      cout << signed_int_j << endl;
      //输出:2863311530
      //     -1431655766
      
      bitset<sizeof(unsigned int)*8> bin_i(unsigned_int_i);  //将unsigned_i以二进制形式输出
      bitset<sizeof(signed int)*8> bin_j(signed_int_j);//将signed_j以二进制形式输出
      cout << setw(32) << bin_i << endl; 
      cout << setw(32) << bin_j << endl;  
      //输出:10101010101010101010101010101010
      //     10101010101010101010101010101010
      
      return 0;
    }

    #---------------------------------------------------------------------------------#

    参考文献

    cousera course: Introduction to Computing, by Li Ge

     

  • 相关阅读:
    一些浏览器的兼容和雪碧图的使用
    常用的一些样式
    Open.auth 开源项目学习(一)SSO单点登录
    一个开发人员对于职业生涯规划的感想
    从今天开始分享自己的学习经历
    mysql在海量数据时的处理方案
    Mysql分区
    su和sudo的区别
    su:authentication failure问题
    大数据处理思路
  • 原文地址:https://www.cnblogs.com/dfcao/p/assignment_transform.html
Copyright © 2020-2023  润新知