C++ Primer 4.11类型转换

4.11类型转换

在C++语言中,如果两种类型可以相互转换,那么就称他们是关联的。
如果类型转换是自动执行的,无需程序员的介入(甚至不需要程序员的了解),就称这种转换为隐式转换。
算术类型之间的隐式转换被实际的尽可能避免损失精度。很多时候,如果表达式中既有整数类型的运算也有浮点数类型的运算对象,整型会转成浮点型。
在初始化的过程中,由于被初始化类型的对象的类型无法被改变,所以初始值将会转换成该对象的类型。
举个例子:

int ival = 3.541 + 3;  // 此时编译器可能警告该运算损失了精度

下面解释该行代码:
在本例子中,3先转换成double类型然后执行浮点数的加法,所得结果是double。接下来是初始化的任务,加法运算得到的double类型的结果转换成int类型的值,这个值被用来初始化ival。

何时发生隐式类型转换

在下面的这些情况下,编译器会自动的转换运算对象的类型

  • 在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型。
  • 在条件中,非布尔值转换成布尔类型。
  • 初始化过程中,初始值转换成变量的类型;再赋值语句中,右侧运算对象转换成左侧运算对象的类型。
  • 如果算术运算或关系运算的运算对象有多种类型,需要转换成同一种类型。
  • 函数调用时也会发生类型转换。
4.11.1 算术转换

算术转换的含义是把一种算术类型转换成另外一种算术类型,算术转换的规则定义了一套类型转换的层次,其中运算符的运算对象将转换成最宽的类型。

整型提升

整型提升负责把小整数类型转换成较大的整数类型。比如,对于bool,char,signed char,unsigned char,short和unsigned short等类型来说,只要他们所有可能的值都能存在int里,他们就会提升成int类型;否则,提升成unsigned int类型。

较大的char类型(wchar_t、char16_t、char32_t)提升成int、unsigned int、long、unsigned long、long long和unsigned long long中最小的一种类型,前提是转换后的类型要能容纳原类型所有可能的值。

无符号类型的运算对象

如果某个运算符的运算对象类型不一致,这些运算对象将转换成同一类型。
但是如果某个运算对象的类型是无符号类型,那么转换的结果就要依赖于机器中各个整数类型的相对大小了。

如同往常一样,首先进行整型提升。若结果的类型匹配则无需进一步的转换;若提升后的运算对象要么都是带符号的、要么都是无符号的,则小类型运算对象会转换成较大的类型。

如果一个运算对象是无符号类型】另外一个运算对象是带符号类型、而且其中的无符号类型不小于带符号类型,那么带符号的运算对象转换成无符号的。例如,unsigned int和 int,则int转换成unsigned int类型。

剩下的一种情况是带符号类型大一无符号类型,此时转换的结果依赖于机器。若无符号类型的所有值都能存在带符号的类型中,则无符号类型的运算对象转换成带符号类型。否则带符号类型运算对象转换成无符号类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值