类型转换(Type Casting)
类型转换是一种将变量从一种数据类型转换为另一种数据类型的方法。 例如,如果要将long值存储到简单整数中,则可以将cast long类型设置为int。 您可以使用强制转换cast operator将值从一种类型转换为另一种类型,如下所示 -
(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值。
类型转换可以是隐式的,由编译器自动执行,也可以通过使用转换cast operator显式指定。 每当需要类型转换时,使用强制转换运算符被认为是一种很好的编程习惯。
整数推广
整数提升是将整数类型“小于” int或unsigned int的值转换为int或unsigned int 。 考虑在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。
通常的算术转换
隐式执行usual arithmetic conversions以将它们的值usual arithmetic conversions为通用类型。 编译器首先执行integer promotion ,如果操作数仍然具有不同的类型,则它们将转换为在以下层次结构中显示最高的类型 -
通常的算术转换不是为赋值运算符执行,也不是为逻辑运算符&&和||执行。 让我们以下面的例子来理解这个概念 -
#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被转换为整数但是因为最终值是float,所以通常的算术转换适用,编译器将i和c转换为float并添加它们产生float结果。