4.2.4 整型值和浮点值的相互转换
要更有效地开发Objective-C程序,必须理解Objective-C中浮点值和整型值之间进行隐式转换的规则。代码清单4-5表明数值数据类型间的一些简单转换。
代码清单4-5
//Basic conversions in Objective-C
import<Foundation/Foundation.h>
int main(int argc, char*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];
float f1=123.125,f2;
int i1,i2=-150;
i1=f1;//floating to integer conversion
NSLog(@“f assigned to an int produces%i”,f1,i1);
f1=i2;//integer to floating conversion
NSLog(@“i assigned to a float produces%f”,i2,f1);
f1=i2/100;//integer divided by integer
NSLog(@“i divided by 100 produces%f”,i2,f1);
f2=i2/100.0;//integer divided by a float
NSLog(@“i divided by 100.0 produces%f”,i2,f2);
f2=(float)i2/100;//type cast operator
NSLog(@“float)%i divided by 100 produces%f”,i2,f2);
[pool drain];
return 0;
}
代码清单4-5输出
123.125000 assigned to an int produces 123
-150 assigned to a float produces-150.000000
-150 divided by 100 produces-1.000000
-150 divided by 100.0 produces-1.500000
(float)-150 divided by 100 produces-1.500000
在Objective-C中,只要将浮点值赋值给整型变量,数字的小数部分都会被删节。因此,在前一个程序中,把f1的值指派给i1时,数字123.125将被删节,这意味着只有整数部分(即123)存储到了i1中。程序输出的第一行验证了上述程序就是此种情况。
把整型变量指派给浮点变量的操作不会引起数字值的任何改变;该值仅由系统转换并存储到浮点变量中。程序输出的第二行验证了这一情况:i2的值(-150)进行了正确转换并存储到float变量f1中。
程序输出的后两行说明了在编写算术表达式时要记住的两点。第一点和整数运算有关,在前一章已经讨论了这一点。只要表达式中的两个运算数是整型(而且这一情况还适用于short、unsigned和long所修饰的整型),该运算就将在整数运算的规则下进行。因此,由乘法运算产生的任何小数部分都将删除,即使该结果指派给一个浮点变量(如同我们在程序中所做的那样)也是如此。当整型变量i2除以整数常量100时,系统将该除法作为整数除法来执行。因此,-150除以100的结果,即-1,将存储到float变量f1中。
在前一个程序中,后一个除法涉及一个整数变量和一个浮点常量。在Objective-C中,任何处理两个值的运算如果其中一个值是浮点变量或常量,那么这一运算将作为浮点运算来处理。因此,当i2的值除以100.0时,系统将除法作为浮点除法来计算,并产生结果-1.5,该结果将指派给float变量f1。