类型转换
【赋值转换】
赋值转换指的是将一种类型的值赋给另一种类型的变量,这时,值将会转换为接收变量的类型,如语句:
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。