meo学习笔记5:C++中的类型转换概述

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;
}

meo学习笔记5:C++中的类型转换概述_第1张图片

2.1.2 其他隐式转换

待续。。。。
此时我只是一个书籍搬运工

你可能感兴趣的:(C++)