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