类型转换是一种将变量从一种数据类型转换为另一种数据类型的方法。 例如,如果要将long
值存储到简单整数(int
)中,则可以将long
类型转换设置为int
。使用强制转换运算符将值从一种类型转换为另一种类型,如下所示 -
(type_name) expression
在Objective-C中,通常使用CGFloat
进行浮点运算,它是在32
位情况下从基本类型的float
派生的,在64
位情况下是double
类型。参考以下示例,使用转换运算符将一个整数变量除以另一个整数变量,结果为浮点数 -
1 #import <Foundation/Foundation.h> 2 3 int main() { 4 int sum = 17, count = 5; 5 CGFloat mean; 6 7 mean = (CGFloat) sum / count; 8 NSLog(@"Value of mean : %f\n", mean ); 9 10 return 0; 11 }
执行上面示例代码,得到以下结果:
2018-11-15 09:25:04.889 main[28822] Value of mean : 3.400000
这里应该注意,强制转换操作符优先于除法,因此sum
的值首先转换为double
类型,最后除以count
,得到double
类型的值。
类型转换可以是隐式的,由编译器自动执行,也可以通过使用转换运算符显式指定。每当需要类型转换时,使用强制转换运算符是一种很好的编程习惯。
整型提升
整数提升是将整数类型“小于” int
或unsigned int
的值转换为int
或unsigned int
的过程。 考虑在int
中添加字符的示例 -
1 #import <Foundation/Foundation.h> 2 3 int main() { 4 int i = 17; 5 char c = 'c'; /* ascii value is 99 */ 6 int sum; 7 8 sum = i + c; 9 NSLog(@"Value of sum : %d\n", sum ); 10 11 return 0; 12 }
当执行上面示例代码时,得到以下结果:
2018-11-15 09:28:10.138 main[110351] Value of sum : 116
这里,sum
的值将变为116
,因为编译器进行整数提升,并在执行加法运算之前将字符'c'
的值转换为ascii
值。
通用的算术转换
隐式执行通常的算术转换以将它们的值转换为通用类型。编译器首先执行整数提升,如果操作数仍然具有不同的类型,则它们将转换为在以下层次结构中显示最高的类型 -
通常的算术转换不是为赋值运算符执行,也不是为逻辑运算符&&
和||
执行。下面看一个例子来理解这个概念 -
1 #import <Foundation/Foundation.h> 2 3 int main() { 4 int i = 17; 5 char c = 'c'; /* ascii value is 99 */ 6 CGFloat sum; 7 8 sum = i + c; 9 NSLog(@"Value of sum : %f\n", sum ); 10 return 0; 11 }
执行上面示例代码,得到以下结果:
2018-11-15 09:28:10.138 main[110351] Value of sum : 116
在这里,很容易理解第一个c
字符被转换为整数,但是因为最终值是float
,所以通常的算术转换适用,编译器将i
和c
转换为float
并相加,所以最终产生的是float
类型。