注意:以下内容摘自文献[1],修改了部分内容。
1.赋值过程中的类型转换
如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时自动进行类型转换。
(1) 将浮点型数据(包括单、双精度)赋给整型变量时,舍弃其小数部分。
(2) 将整型数据赋给浮点型变量时,数值不变,但以指数形式存储到变量中。
(3) 将一个double型数据赋给flout变量时,要注意数值范围不能溢出。
float f; double d = 123.456789e100; f = d;
就会出现溢出的错误,因为超过了float型的数据范围。
(4) 字符型数据赋给整型变量,将字符的ASCII码赋给整型变量。
(5) 将一个int, short或long型数据赋给一个char型变量,只将其低8位原封不动地送到char型变量(发生截断)。例如
short int i = 289; char c; c = i; // 将一个int型数据赋给一个char型变量
i = 289
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
c = 33
0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
为了方便,假设一个int型数据占两个字节(实际上,在VC++ 6.0中占4个字节),得到的c = 33,只得到i的低8位。
(6) 将signed型数据数据赋给长度相同的unsigned型变量,将存储单元内容原样照搬(连原有的符号位也作为数值一起传送)。
例子:
// 20191009.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include <iostream> #include <typeinfo> using namespace std; int main() { system("color 3f"); unsigned short a; short int b = -1; a = b; cout << "a = " << a << endl; system("pause"); return 0; }
结果:
不妨从变量值在内存中存储形式分析,数据在内存中都是以二进制形式的补码存储的。b = -1,-1的补码形式为:1111 1111 1111 1111,将它全部传给a,a是无符号短整型变量,a = 1111 1111 1111 1111 = 65535;如果b为正值,且在0~32767之间,则赋值后数值不变。
参考文献
[1]谭浩强.C++程序设计[M].北京:清华大学出版社.