Objective-C 类型转换

  • 类型转换

    类型转换是一种将变量从一种数据类型转换为另一种数据类型的方法。例如,如果要将long值存储为int整数,则可以将强制类型转换为整数。您可以使用强制转换运算符将值从一种类型显式转换为另一种类型,如下所示:
    
    (type_name) expression
    
    在Objective-C中,我们通常使用CGFloat进行浮点运算,这是从float的基本类型派生的(如果是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;
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    2020-08-11 01:35:40.047 test[20634] Value of mean : 3.400000
    
    此处应注意,强制转换运算符的优先级高于除法,因此sum的值首先转换为double类型,最后将其除以count得出一个double值。类型转换可以是隐式的,可以由编译器自动执行,也可以通过使用强制转换运算符显式指定。在需要进行类型转换时,使用强制转换运算符被认为是良好的编程习惯。
  • 整型提升

    整数提升是将整数类型“小于” 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;
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    2020-08-08 16:03:24.050 test[12936:10456] Value of sum : 116
    
    此处,sum的值为116,因为编译器在执行实际加法运算之前正在进行整数提升并将'c'的值转换为ascii。
  • 通常的算术转换

    在通常的算术转换是隐含进行投中一个常见的类型的值。编译器首先执行整数提升,如果操作数仍具有不同的类型,则它们将转换为在以下层次结构中显示最高的类型-
    通常不对赋值运算符执行逻辑运算,也不对逻辑运算符&&和||执行运算。让我们通过以下示例来了解概念-
    
    #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;
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    2020-08-08 16:25:16.192 test[11744:12796] Value of sum : 116.000000
    
    在这里,很容易理解,第一个c被转换为整数,但是由于最终值是浮点数,因此通常进行算术转换,并且编译器将i和c转换为浮点数并将其相加,得出浮点数结果。