Obj C相当于Double.doubleToLongBits

时间:2010-11-05 19:10:33

标签: java objective-c bytecode-manipulation

我正在将一些Java代码移植到Objective C并且知道得足以让人头疼。有人能指出我对等于Double.doubleToLongBits和Float.floatToIntBits的objC吗?

2 个答案:

答案 0 :(得分:5)

正如 jojoba 所指出的那样,long并不能保证是64位宽(尽管他说它是32位 - long是64位宽是错误的64位平台上的Objective-C)。也就是说,我会使用实际固定宽度类型而不是long long

#include <stdint.h>

uint64_t doubleToBits(double x) {
    const union { double f; uint64_t i; } xUnion = { .f = x };
    return xUnion.i;
}

uint32_t floatToBits(float x) {
    const union { float f; uint32_t i; } xUnion = { .f = x };
    return xUnion.i;
}

答案 1 :(得分:3)

在Objective C中没有安全的方法将double的位分配给long。 在Java中,longdouble都是64位。在目标C的某些情况下,long为32位,double为64位。

您应该使用long long代替。

int intValue = *((int*)(&floatValue));
long long llValue = *((long long*)(&doubleValue));