Cocoa 将(u)int64_t转换为NSN编号

Cocoa 将(u)int64_t转换为NSN编号,cocoa,nsnumber,uint64,Cocoa,Nsnumber,Uint64,所以本质上我的问题是,我正在创建一个NSMutableDictionary,使用uint64\t对象作为键 有没有比这样做更好的方法来创建它们 uint64_t bob=7; NSNumber *bobsNumber; #if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 bobsNumber=[NSNumber numberWithUnsignedLo

所以本质上我的问题是,我正在创建一个NSMutableDictionary,使用uint64\t对象作为键

有没有比这样做更好的方法来创建它们

uint64_t bob=7;

NSNumber *bobsNumber;

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
bobsNumber=[NSNumber numberWithUnsignedLong:bob];
#else
bobsNumber=[NSNumber numberWithUnsignedLongLong:bob];
#endif
只要不将其包含在二进制文件/sockets/NSData object/任何文件中,这都可以工作。但是有没有更好的方法呢?我真的很想确保这个对象是64位的,不管我在什么平台上运行它


我想我可以通过总是使用无符号的long-long来避免整个问题,但如果我以任何有效数字分配这些对象,那么当然会在64位机器上浪费大量堆空间。…

long
在64位OS X/iOS平台上是64位的。在所有OpenStep降级平台上,
numberWithUnsignedLongLong:
对于
uint64\t
是正确的

上次我检查时,您使用的工厂方法实际上并不影响所使用的表示;它只取决于数字的值(除非您使用的大小太小,导致其被截断)


更新:最近,正确的答案是
NSNumber*bobsNumber=@(bob)

这不重要的原因是编译器最了解所用类型的实际位宽。如果它们不匹配,一个被转换成另一个——要么通过剪切位,要么通过扩展前导0。你误解了。我在第二段中的意思是,
[NSNumber numberWithLongLong:73]
将生成与
[NSNumber numberWithChar:73]
相同的对象,而不是一个生成一个
long
后面的对象,另一个生成一个
char
后面的对象。现在我费心重新检查,10.6.4中的情况并非如此。(您可以使用
CFShow()
检查这一点,它告诉您内部表示。)