Objective-C 类型转换(Type casting)
类型转换(Type casting)是一种将变量从一种数据类型转换为另一数据类型的方法。例如,如果要将长值存储为简单整数,则可以将长值转换为int。可以使用 cast operator 转换运算符显式地将值从一种类型转换为另一种类型,如下所示:
(type_name) expression
在 Objective-C 中,我们通常使用 CGFloat
进行浮点运算,在 32 位的情况下,它是从 float 浮点的基本类型派生出来的,在 64 位的情况中,它是 double 双精度的。参考下面实例,其中强制转换运算符导致将一个整数变量除以另一个整数作为 float 运算执行:
#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;
}
结果如下:
2022-07-07 16:35:40.047 demo[20634] Value of mean : 3.400000
这里需要注意的是,强制转换运算符的优先级高于除法,因此首先将 sum
的值转换为 doubl
类型,最后将其除以 count
,得到一个 double 双精度值。
类型转换可以是隐式的,由编译器自动执行,也可以通过使用 cast 运算符显式指定。每当需要进行类型转换时,使用 cast 运算符被认为是一种良好的编程习惯。
整数提升
整数提升是将小于 int 整数或 unsigned 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;
}
结果如下:
2022-07-07 16:38:28.492 demo[980] 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;
}
结果如下:
2022-07-07 16:41:39.192 demo[15351] Value of sum : 116.000000
在这里,很容易理解第一个 c
被转换为整数,但因为最终值是 float,所以通常的算术转换适用,编译器将 i
和 c
转换为 float 浮点,并将它们相加,产生 float 结果。