目标C.将int转换为浮动

12 c floating-point int objective-c

很抱歉这样的一般性问题,但是在ObjC中将int转换为float的最佳(尽可能快且最安全)方法是什么:

第一

int b = 10;
float a = [[NSNumber numberWithInt: b] floatValue]
Run Code Online (Sandbox Code Playgroud)

会有NSNumber实例和消息numberWithInt,floatValue会发送,对吗?

第二

int b = 10;
float a = (float) b;
Run Code Online (Sandbox Code Playgroud)

C风格:这跟一些子程序调用?

或者另一种方式?

为什么?

She*_*ley 12

C风格的类型演员是最清晰,最容易阅读的.如果我碰巧找到创建NSNumber对象的代码只是让它进行转换,那么我会想知道"为什么他这样做呢?除了普通的旧类型转换之外,这里发生了什么?我错过了什么?"

至于速度,我怀疑简单的类型转换也会更快 - NSNumber对象需要执行几乎相同的操作来进行转换,并且还有额外的对象创建和消息传递开销.但就像在所有这些情况下一样,不要猜测 - 测量.描述您的代码,看看转换是否是一个足以引起您注意的瓶颈.

  • 那么问题来了,用什么填充它?如果你用文字硬编码值填充它们,你可以简单地编写`NSMakeRect(1.0, 1.0, 1.0, 1.0)`,不需要转换。另一方面,如果你从 plist 读取数据,无论如何你都会得到一个 NSNumber 对象,所以只需调用它的 `-floatValue` 方法。对 `-intValue` 的返回值进行类型转换只会造成毫无意义的混淆。最简单的方法几乎总是最好的。 (2认同)

R..*_*R.. 5

既然你问安全问题,首先需要检查的是你的价值是否int适合float.否则你会默默地丢失数据.除非该值非常小,否则它将不合适.我会切换到使用,double所以你不必担心这个,然后只做作业:

double d;
d = i;
Run Code Online (Sandbox Code Playgroud)

类型变量很少使用float,就像short...

  • @nick:因为最大值较大并不意味着任何`int`都适合`float`."浮点"(IEEE单精度)只有24个尾数值位.这意味着如果一个整数大于2 ^ 24-1,如果低位全部为零,它只适合浮点数.也就是说,`0x1fffffe`适合,但`0x1ffffff`不适合.如果您不相信我,请尝试将后者转换为浮动并返回,您将看到值已更改.(如果您使用的是带有GCC的x86,请务必使用`-ffloat-store`,否则它可能无法实际转换.) (3认同)