我正在将一些Java代码移植到Objective C并且知道得足以让人头疼。有人能指出我对等于Double.doubleToLongBits和Float.floatToIntBits的objC吗?
答案 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中,long
和double
都是64位。在目标C的某些情况下,long
为32位,double
为64位。
您应该使用long long
代替。
int intValue = *((int*)(&floatValue));
long long llValue = *((long long*)(&doubleValue));