C++中类型转换概述(待更新…)
1. 前言
在C++中某些类型存在关联,有时我们可能需要用一种类型来替代另一种类型,此时就需要类型转换,类型转换一般可分为隐式类型转换(编译器自动进转换)和强制/显示类型转换(开发者手动进行),以下将针对这里两种类型做一个大致的介绍。
注:本文类容大部分来源于《C++ primer》一书
2. 直奔主题
2.1 隐式类型转换
隐式类型转换包括算数类型转换,和其他的隐式转换;
比如:这个我们平时用得比较多,或是说经常考的比较多,比如int r = 5.02 + 4
的结果为9就是进行的隐式转换, 先将4转换为double再和5.02相加,最后将结果9.02初始化int r,使double又转换为了int。
2.1.1 算数转换
概念上讲:将一种算数类型转换为另一种算数类型。转换大致都是按照最近最大原则,就是旁边谁能存得数值范围更大就向谁转换。
(1)整型提升
我们知道内置的算数类型分为两类,整型和浮点型,整型提升就会将较小的整数类型提升成为较大的整数类型:
char、signed char、unsigned char、short、unsigned short →→提升为→→
int 或 unsinged int
wchar_t、char16_t、char32_t→→提升为→→
int或unsinged int 或 long 或 unsigned long 或 long long 或 unsigned long long
(之所以会”或”是根据具体转换后的类型是否能存下转换前的全部数值范围)
(2)无符号类型转换
比如有两个运算对象,un_a和a,其中un_a为无符号类型,a为带符号类型。
un_a的类型不小于a :则a将转换为un_a的类型,但是如果a正好是个负数,那么将产生一些副作用,比如说int 会转换为 unsigned int ,int如果是正数那么相安无事,但是如果是负数,则出现问题(所以切勿混用带符号类型和无符号类型)。
un_a的类型小于a :转换依赖于机器,如果无符号类型的值都能存在于带符号类型则就转换为带符号类型,如果不能则都转换为无符号类型。eg,long 和 unsigned int,假设机器中int 和long大小一致,则long 转换为 unsigned int(大小一致时向无符号转换), 但如果机器的long 比int 大,则unsigned int将转为long(向大的转)
(3)总结基本规则
运算对象不一致时,转换为同一种类型。如果是整数,先进行整型提升,提升后发现两个符号类型不一致,则进行符号类型转换,转换的原则是大小一致的,有符号向为无符号转换(注意负数将出现异常),大小不一致的,类型小的向类型大的转换。
(4)例子
(源于书籍)
int main()
{
bool flag = 0; char cval = 'a';
short sval = -1; unsigned short usval = 1;
int ival = -1; unsigned int uival = 1;
long lval = -1; unsigned long ulval = 1;
float fval = 1.0; double dval = 1.0;
cout << typeid(3.14L + 'a').name() << endl; // 'a'提升为int, int再转换为long double
cout << typeid(dval + ival).name() << endl; // ival转换为double
cout << typeid(dval + fval).name() << endl; // fval转换为double
cout << typeid(ival = dval).name() << endl; // dval 转换为int
cout << typeid(flag = dval).name() << endl; // 如果 dval 是 0,则 flag 是 false,否则 flag 是 true
cout << typeid(sval + cval).name() << endl; // sval和cval都提升成int
cout << typeid(cval + lval).name() << endl; // cval 转换成 long
cout << typeid(ival + ulval).name() << endl; // iva丄转换成 unsigned long
cout << typeid(usval + ival).name() << endl; // 根据unsigned short和int所占空间的大小进行提升
cout << typeid(uival + lval).name() << endl; // 根据unsigned int和long所占空间的大小进行转换
system("pause");
return 0;
}
2.1.2 其他隐式转换
待续。。。。
此时我只是一个书籍搬运工