类型转换

C++自动执行很多类型转换:

• 将一种算术类型的值赋给另一种算术类型的变量时,C++将对值进行转换:
• 表达式中包含不同的类型时,C++将对值进行转换;
• 将参数传递给函数时,C++将对值进行转换。

 

1.初始化和赋值进行的转换

        一种类型的值赋给另一种变量时,值将被转换为接受变量的类型。将一个值赋给取值范围更大的类型通常不会导致什么问题,否则可能会出现一些转换问题。例如,double转换为float,精度降低,值有可能超出范围,结果是不确定的:浮点型转换为整型,丢失小数部分,值有可能超出范围,结果不确定:较大整型装换位较小整型,原来的值可能超出范围,通常只复制右边的字节。

 

2.以{}方式初始化时进行的转换(C++11列表初始化)

       这种初始化常用于给复杂的数据类型提供值列表,对类型转换的要求更严格,不允许窄缩(即变量的类型可能无法表示赋给它的值)。

 

3.表达式中的转换

      整型提升:在计算表达式中,C++将bool、char、unsigned char、signedchar和short转换位int。

C++11:

(1) 如果有一个操作数的类型是long double,则将另一个操作数转换为long double。

(2)否则,如果有一个操作数的类型是double,则将另一个操作数转换为double

(3)否则,如果有一个操作数的类型是float,则将另一个操作数转换为float

(4)否则,说明操作数都是整型,因此执行整型提升。

(5)在这种情况下 ,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。

(6)如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型。(7)否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。

(8)否则,将两个操作数都转换为有符号类型的无符号版本

PS:传统C总是将float提升为double,即使两个操作数都是float。

 

4.传递参数时的转换

      传递参数时类型的转换通常由函数原型控制,然而也可以取消原型对参数传递的控制,在这种情况下,C++对char和short类型进行整型提升。另外为保持与传统C兼容,在将参数传递给取消原型对参数传递控制的函数,C++将float参数提升为double。

 

5.强制类型转换

(typeName) value;  来自C

typeName (value);   C++

        强制类型不会修改变量本身,而是创建一个新的、指定类型的值,可以在表达式中使用这个值。

        C++还引入了4个强制类型转换运算符,对他们的使用要求更为严格。

static_cast<>

可用于将值从一种类型转换为另一种类型。

static_cast<typeName> value

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值