数据类型转换
- 引言
- 自动类型转换
- 强制类型转换
- 数据类型的别名
引言
计算机进行运算时,要求各操作数
的数据类型
、大小
和存储方式
都要相同
。(例如:8字节的整数和8字节的浮点数,虽然占用内存大小一样,但是存储方式不同,所以两者不能直接进行运算)
在实际开发中,不同类型的数据进行混合运算是基本需求。
自动类型转换:某些类型的转换编译器可以隐式进行
,不需程序员干预。
强制类型转换:有些类型的转换需要程序员显式指定
。
自动类型转换
不同数据类型的差别在于取值范围
和精度
,数据的取值范围越大
,精度越高
。
整型
从低
-> 高
:
char
-> short
-> int
-> long
-> long long
浮点型
从低
-> 高
:
float
-> double
-> long double
自动类型转换
的规则如下:
- 如果一个表达式中出现了不同类型操作数的混合运算,
较低类型
将自动
向较高类型
转换;
#include <iostream>
using namespace std;int main() {char n1 = 123; // 占用1字节int n2 = 98465; // 占用4字节long long n3 = 123456789000000; // 占用8字节,把n1和n2转换成n3肯定没问题。cout << "n1 + n2 + n3 = " << n1 + n2 + n3 << endl;return 0;
}
在运算之前,编译器会先把n1
和n2
先转换成long long
类型,再和n3
进行运算。
- 当表达式中含有
浮点型
操作数时,所有操作数
都将转换
为浮点型
,其实就是把更小
的操作数转换
为更大
的操作数,这种转换没有风险;运行如下代码:
cout << "8 / 5 = " << 8 / 5 << endl; // 0.6会被舍弃掉
cout << "8.0 / 5 = " << 8.0 / 5 << endl;
运行结果如下:
8 / 5 = 1
8.0 / 5 = 1.6
这是因为整数和浮点数的存储方式不同。不管小数点后面的数字是大还是小,整数都没办法保存它。
- 赋值运算的右值类型与左值类型不一致时,将右值类型提升/降低为左值类型;
int n4 = 'a'; // 'a'为char类型,取值范围小于int,赋值时自动转换为int类型
cout << "n4 = " << n4 << endl;int n5 = 123.456; // 123.456为double类型,取值范围大于int,赋值时自动转换为int类型,小数部分舍弃
cout << "n5 = " << n5 << endl;
运行结果如下:
n4 = 97
n5 = 123
- 赋值运算右值超出了左值类型的表示范围,把该右值截断后赋给左值,所得结果可能毫无意义。
int n6 = 4294967295 + 1;
cout << "n6 = " << n6 << endl;
运行结果如下:
n6 = 0
强制类型转换
为了让程序设计更灵活,转换的目的更清晰,C++提供了强制类型转换
的方法,也称之为显式转换
。
强制类型转换的语法:(目标类型) 表达式
示例代码如下:
cout << "(double) 8 / 5 = " << (double) 8 / 5 << endl;
运行结果如下:
(double) 8 / 5 = 1.6
注意:
- 如果使用
强制转换
,表示已有明确的目的
; - 如果采用了
强制类型转换
,编译的告警信息
将不再出现
;
int n6 = (int) 4294967295 + 1; // 如果不强制转成(int),编译会通过,但编译器会提出告警信息。
cout << "n6 = " << n6 << endl;
- 类型转换运算符的优先级比较高,如果没把握就
加括号
。
数据类型的别名
创建数据类型别名
的目的:
- 为名称
复杂
的类型创建别名
,方便
书写和记忆; - 创建
与平台无关
的数据类型,提高程序的兼容性
。
语法:typedef 原数据类型名 别名
;
C++11还可以用using关键字创建数据类型的别名。
示例代码如下:
#include <iostream>
using namespace std;int main()
{// 在VS中,short是两个字节,int是四个字节,long也是四个字节,long long是八个字节。typedef short int16_t; // 16位的整数。typedef int int32_t; // 32位的整数。typedef long long int64_t; // 64位的整数。// 在Linux中,short是两个字节,int是四个字节,long也是八个字节,long long也是八个字节。typedef short int16_t; // 16位的整数。typedef int int32_t; // 32位的整数。typedef long int64_t; // 64位的整数。// 在程序源代码中,只使用别名int16_t、int32_t、int64_t,不使用原名。
}
感谢浏览,一起学习!