Objective-C 类型转换(Type casting)

类型转换(Type casting)是一种将变量从一种数据类型转换为另一数据类型的方法。例如,如果要将长值存储为简单整数,则可以将长值转换为int。可以使用 cast operator 转换运算符显式地将值从一种类型转换为另一种类型,如下所示:

  1. (type_name) expression

在 Objective-C 中,我们通常使用 CGFloat 进行浮点运算,在 32 位的情况下,它是从 float 浮点的基本类型派生出来的,在 64 位的情况中,它是 double 双精度的。参考下面实例,其中强制转换运算符导致将一个整数变量除以另一个整数作为 float 运算执行:

  1. #import <Foundation/Foundation.h>
  2. int main() {
  3. int sum = 17, count = 5;
  4. CGFloat mean;
  5. mean = (CGFloat) sum / count;
  6. NSLog(@"Value of mean : %f\n", mean );
  7. return 0;
  8. }

结果如下:

  1. 2022-07-07 16:35:40.047 demo[20634] Value of mean : 3.400000

这里需要注意的是,强制转换运算符的优先级高于除法,因此首先将 sum 的值转换为 doubl 类型,最后将其除以 count,得到一个 double 双精度值。

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


整数提升

整数提升是将小于 int 整数或 unsigned int 无符号整数的整数类型的值转换为整数或无符号整数的过程。请参考在整数中添加字符的实例:

  1. #import <Foundation/Foundation.h>
  2. int main() {
  3. int i = 17;
  4. char c = 'c'; /* ascii value is 99 */
  5. int sum;
  6. sum = i + c;
  7. NSLog(@"Value of sum : %d\n", sum );
  8. return 0;
  9. }

结果如下:

  1. 2022-07-07 16:38:28.492 demo[980] Value of sum : 116

在这里,sum 的值为 116,因为编译器在执行实际加法运算之前正在进行整数提升,并将 'c' 的值转换为 ascii


常用算术转换

通常的算术转换 是隐式执行的,以将其值转换为公共类型。编译器首先执行 整数提升,如果操作数仍然具有不同的类型,则将它们转换为在以下层次结构中显示最高的类型:

通常的算术转换不适用于赋值运算符,也不适用于逻辑运算符 && ||

让我们以下面的例子来理解这个概念:

  1. #import <Foundation/Foundation.h>
  2. int main() {
  3. int i = 17;
  4. char c = 'c'; /* ascii value is 99 */
  5. CGFloat sum;
  6. sum = i + c;
  7. NSLog(@"Value of sum : %f\n", sum );
  8. return 0;
  9. }

结果如下:

  1. 2022-07-07 16:41:39.192 demo[15351] Value of sum : 116.000000

在这里,很容易理解第一个 c 被转换为整数,但因为最终值是 float,所以通常的算术转换适用,编译器将 ic 转换为 float 浮点,并将它们相加,产生 float 结果。