Objective C. 将 int 转换为 float

16
抱歉提出这样泛泛而谈的问题,但在ObjC中将整数转换为浮点数的最佳(尽可能快且最安全)方法是什么? 首先
int b = 10;
float a = [[NSNumber numberWithInt: b] floatValue]

会有一个NSNumber实例和发送numberWithIntfloatValue消息,是这样的吗?

第二点

int b = 10;
float a = (float) b;

C风格:使用this关键字调用某个子程序?

或者还有其他方式吗?

为什么?


使用强制类型转换。它不会调用子程序。编译器将确保使用正确的汇编代码。 - hooleyhoop
5
不使用转换语句,直接使用 float a = b; 即可。 - pmg
3个回答

13

C风格的类型转换是最清晰和易于阅读的。如果我发现有代码创建了一个NSNumber对象仅仅为了进行转换,那么我就会想:"为什么他要这样做?除了简单的类型转换外还发生了什么?我错过了什么?"

至于速度,我怀疑简单的类型转换也会更快——NSNumber对象需要执行几乎相同的操作来进行转换,并且还需要创建对象和消息传递的额外开销。但像所有这类情况一样,不要猜测——测量。对您的代码进行性能分析,以确定转换是否是值得关注的瓶颈。


我只想填充CGRect结构大约10次,但发现不知道最好的转换方法。 - user663896
2
那么问题是,用什么来填充呢?如果你用字面硬编码的值来填充它们,你可以直接写 NSMakeRect(1.0, 1.0, 1.0, 1.0),不需要进行转换。另一方面,如果你从 plist 中读取数据,你会得到一个 NSNumber 对象,所以只需调用它的 -floatValue 方法即可。对 -intValue 返回值进行类型转换将没有任何意义,只会使代码变得混乱。最简单的方式通常也是最好的。 - Sherm Pendley
我正在使用for循环完成此操作,从中获取int值并将其传递到CGRect结构体中。 - user663896
然后只需使用类型转换。这是最清晰和最易于阅读的方法,如果您只需要执行十次操作,则绝对没有浪费时间尝试“优化”的理由。 - Sherm Pendley

5

既然您关心安全,那么您首先需要检查的是您的int值是否适合于float。否则,您将会无声地丢失数据。除非值非常小,否则它不会适合。我建议使用double,这样您就不必担心这个问题,然后只需进行赋值:

double d;
d = i;

很少有用处的类型为float的变量,就像short一样...

浮点数的最大值比整数的最大值要大得多。浮点数的最大值定义为3.40282347 x 10^38,而整数的最大值定义为2147483647,这使得浮点数的最大值比整数大1.58456316 × 10^29倍。 - nick
4
仅仅因为最大值更大,并不意味着所有的 int 类型都适用于 float 类型。一个 float 类型(IEEE单精度)只有24个有效位用于存储尾数。这意味着如果一个整数大于 2^24-1,它只能在低位全为零时才适合被存储在 float 类型中。也就是说,0x1fffffe 可以被存储在 float 类型中,但是 0x1ffffff 不行。如果你不相信我的话,可以尝试将后者转换成 float ,然后再转换回来,你会发现值已经发生了变化。(如果你在使用 GCC 的 x86 平台上,请确保使用 -ffloat-store 参数,否则可能无法正确转换。) - R.. GitHub STOP HELPING ICE
没错,我从来不知道这个,我道歉。但是对我来说,这似乎有点奇怪。我想要移除-1,但它告诉我投票已被锁定 :( - nick

2

我认为当两个数字原语之间可以直接进行类型转换时,没有必要使用NSNumber对象。而且,NSNumber类并不仅仅是用来进行类型转换的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接