B.5.17 基本数据类型的转换

Objective-C语言以一种预定义的顺序转换算术表达式中的运算数,这种转换称为普通算术转换:

(1)如果其中一个运算数的类型为long double,则其他运算数将会转换为long double并以此作为结果类型。

(2)如果其中一个运算数的类型为double,则其他运算符将会转换为double并以此作为结果类型。

(3)如果其中一个运算数的类型为float,则其他运算数将会转换为float并以此作为结果类型。(4)如果其中一个运算数为_Bool、char、short int、int位域或者枚举数据类型,则会在int可以表示其值域时将其转换为int;否则,将其转换为unsigned int。如果两个运算数具有相同的类型,这个类型就会作为结果的类型。

(5)如果两个运算数都是有符号的或者都是无符号的,则较小的整数类型将转换成较大的整数类型,并以较大整数类型作为结果类型。

(6)如果无符号的运算数在大小上等于或大于有符号的运算数,则有符号的运算数将转换成无符号运算数的类型,并以无符号运算数的类型作为结果类型。

(7)如果有符号运算数可以表示无符号运算数中的所有值,则在前者可以完全表达后者的值域时将后者转换成前者的类型,并以前者的类型作为结果类型。

(8)如果到达这一步,则将两个运算数转换成与有符号类型对应的无符号类型。第4步较为正式的叫法是整型提升。

大多数情况下,运算数的转换都会获得很好的效果,但是要注意下列要点:

(1)在某些计算机上,char到int的转换可能会涉及到符号扩展,除非将char声明为unsigned。

(2)有符号整数到长整数的转换会导致符号向左侧扩展;无符号整数到长整数的转换会导致其左侧填充0。

(3)任何值到_Bool的转换,都会在该值为0时产生0,否则产生1。

(4)长整型到某个短整型的转换,会导致长整型在左侧进行截取。

(5)浮点值到整型的转换,将导致浮点值在小数部分进行截取。如果整型的范围不够大,不能包含转换后的浮点值,则结果是不确定的,将负的浮点值转换成一个无符号整型产生的结果也是这样。

(6)较长浮点值到较短浮点值的转换,可能会导致较长浮点值在发生截取前进行舍入,但也可能不会。