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。