Objective-C 类型转换



类型转换是一种将变量从一种数据类型转换为另一种数据类型的方法。例如,如果您想将一个长整型值存储到一个简单的整型中,那么您可以将长整型转换为整型。您可以使用转换运算符显式地将值从一种类型转换为另一种类型,如下所示:

(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值。

类型转换可以是隐式的,由编译器自动执行,也可以通过使用转换运算符显式地指定。当需要类型转换时,使用转换运算符被认为是良好的编程实践。

整数提升

整数提升是指将小于intunsigned int的整数类型的值转换为intunsigned 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 Conversion

通常算术转换不会对赋值运算符或逻辑运算符&&和||执行。让我们举一个例子来理解这个概念:

#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 转换为浮点数并将其相加,得到一个浮点结果。

广告

© . All rights reserved.