Objective-C 类型转换
类型转换是一种将变量从一种数据类型转换为另一种数据类型的方法。 例如,如果你想将一个 long 值存储为一个简单的整数,那么你可以键入 cast long to int。 您可以使用 强制转换运算符 显式地将值从一种类型转换为另一种类型,如下所示 −
(type_name) expression
在 Objective-C 中,我们通常使用 CGFloat 进行浮点运算,它派生自基本类型,在 32 位的情况下是 float,在 64 位的情况下是 double。 考虑以下示例,其中强制转换运算符导致将一个整数变量除以另一个整数变量作为浮点运算执行 −
#import <Foundation/Foundation.h> int main() { int sum = 17, count = 5; CGFloat mean; mean = (CGFloat) sum / count; NSLog(@"Value of mean : %f\n", mean ); return 0; }
当上面的代码被编译和执行时,会产生如下结果 −
2013-09-11 01:35:40.047 demo[20634] Value of mean : 3.400000
这里应该注意,转换运算符优先于除法,所以 sum 的值首先被转换为 double 类型,最后它被 count 除以产生一个 double 值。
类型转换可以是隐式的,由编译器自动执行,也可以通过使用强制转换运算符 显式指定。 每当需要类型转换时使用强制转换运算符被认为是良好的编程习惯。
整数提升
整数提升是将"小于"int 或 unsigned int 的整数类型值转换为 int 或 < b>无符号整数。 考虑一个在 int 中添加字符的例子 −
#import <Foundation/Foundation.h> int main() { int i = 17; char c = 'c'; /* ascii value is 99 */ int sum; sum = i + c; NSLog(@"Value of sum : %d\n", sum ); return 0; }
当上面的代码被编译和执行时,会产生如下结果 −
2013-09-11 01:38:28.492 demo[980] Value of sum : 116
这里,sum 的值为 116,因为编译器在执行实际的加法运算之前进行整数提升并将"c"的值转换为 ascii。
普通算术转换
通常的算术转换 是隐式执行的,以将它们的值转换为通用类型。 编译器首先执行整数提升,如果操作数仍然具有不同的类型,则将它们转换为在以下层次结构中出现最高的类型 −
![普通算术转换](https://www.w3ccoo.com/objective_c/images/usual_arithmetic_conversion.png)
通常的算术转换不对赋值运算符执行,也不对逻辑运算符 && 和 || 执行。 让我们以下面的例子来理解这个概念 −
#import <Foundation/Foundation.h> int main() { int i = 17; char c = 'c'; /* ascii value is 99 */ CGFloat sum; sum = i + c; NSLog(@"Value of sum : %f\n", sum ); return 0; }
当上面的代码被编译和执行时,会产生如下结果 −
2013-09-11 01:41:39.192 demo[15351] Value of sum : 116.000000
在这里,很容易理解,首先 c 被转换为整数,但由于最终值是浮点数,因此应用通常的算术转换,编译器将 i 和 c 转换为浮点数并将它们相加得到浮点数结果。