使用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

 

原文地址:https://www.cnblogs.com/dfcao/p/assignment_transform.html