【C++学习笔记】07_类型转换

类型转换

赋值转换

赋值转换指的是将一种类型的值赋给另一种类型的变量,这时,值将会转换为接收变量的类型,如语句:

A=B;

如果A是long型,B是short型,则程序会将16位(short占两字节)的B提升为32位(long占4字节),并赋给A,直观上讲,类型的表达能力取决于该类型所占的内存位数,从表达能力低的类型转换为表达能力高的类型,即进行字节的扩充通常不会带来什么弊端,将short型值赋值给long型变量并不会改变这个值,只是占用的字节多了而已,但其他一些情况下可能会出现一些转换问题。

(1)      将较大的整型(表达能力强)转换为较小的整型

代码示例:

运行结果:

可见只有低位的两个字节0x5678赋值了给变量y,高位的0x1234被舍弃了。

(2)      浮点型转换为整型

代码示例:

运行结果:

C++采取的是“截取”,而不是四舍五入的方法,当浮点数的值过大时,整型的值就会不确定,在不同的系统会有不同的结果。

(3)      较大的浮点型转换为较小的浮点型

代码示例:

运行结果:

较大的浮点数的值超过目标浮点型的表示范围,将会得到一个不确定的结果

 

(4)整型转换为浮点型

代码示例:

运行结果:

可见,y的实际值为123457000,这可能会给运算带来很大的误差。

(5)bool类型进行赋值

                   将0赋值给bool变量时,会被转换为false;

                   而非0的值赋给bool变量时,就会被转换为true;

 

表达式中的转换

当同一个表达式中出现不同类型的量时,C++会根据不同的情况对操作数进行自动转换,这些转换可分为“整型提升”(integral promotion)和“运算时的转换”两类。

(1)整型提升

在 表 达 式 计 算 中 , C++将 bool、 char、unsigned  char、 signed char、short和signed short型值都会自动转换成int型,对bool类型而言,true转换为1,false则转换为0。

注意:unsigned short向int的转换比较特殊:如果系统中int占4字节,这unsignedchar会转换成int ,但若系统中int 占两字节(即int 和short 同样长度),则unsigned short会转换成unsigned int,这就避免了数据的丢失。

(2)运算时的转换

当运算涉及到两种类型时,较小的类型将会被转换成较大的类型,换言之,表达力低的类型将会被转换成表达力高的类型。各类型表达能力从低到高排列为:

int(等价于signedint)→ unsigned int →long(等价与signed long)→unsigned long → float→double→long double

 

强制类型转换

C++引入了强制类型转换机制来显式地进行类型转换,强制类型转换的格式有两种,举例来说,为了将double型变量x转换为long型,可使用下列语句中的任意一个:

(long) x;

long (x);

第一种格式,即“(类型名)值”这种写法是C语言的用法,而第二种格式,即“类型名(值)”是纯粹的C++用法,这样,类型名等价于一个函数,而要转换的值等价于该函数的参数,函数返回值即是目的类型值。

注意:不论是强制类型转换,还是隐式的赋值转换和表达式中的转换,都不会改变变量的值,而是创建一个新的、指定类型的值,因此,不仅仅可对变量进行类型转换,对常量的显式转换也是合法的,如:

int(3.14);

float(3.1415926535897);

在显式类型转换中,应该特别注意从较高级别的类型转换为较低级别类型时,容易引起数据丢失。

代码示例:

运行结果:

代码中,unsigned char类型在内存中是只占用一个字节的,表达范围从0到255之间,对于“300”只能截取处理,只保留低字节,故返回值是44。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值