将 CGFloat 设置为 double 是否安全?

Is it safe to set a CGFloat to a double?

我在 64 位设备上有以下代码 运行:

CGFloat myFloat = 123.45f;
CGFloat myDouble = 123.45;

这在 32 位和 64 位设备上安全吗?由于 CGFloat 根据处理器架构改变大小,给定的变量是否会在两个平台上包含接近 123.45 的值,或者是否会由于位放置不正确而导致它们爆炸?

这两种情况会发生其中一种吗?

在 64 位中:

myFloat  == 0x0000000042F6E666 == 5.5507143600000000e-315
myDouble == 0x405EDCCCCCCCCCCD == 123.45

在 32 位中:

myFloat  == 0x42F6E666 == 123.45
myDouble == 0xCCCCCCCD == -1.0737418e8

现在,我还没有在现场看到这个问题……这引发了我的另一个问题:为什么我在现场没有看到这个问题?

请记住,您的代码编译了两次,一次针对 32 位,一次针对 64 位。

为 32 位编译时,您的代码如下所示:

float myDouble = 123.45;

所以,你的问题的答案是肯定的,编译器知道如何处理该代码,它会工作得很好。

您需要注意的是将 64 位双精度值分配给 32 位浮点变量时精度的损失。在这种情况下,编译器会为您生成有关精度损失的警告,但您只会在编译代码的 32 位版本时看到警告。