【问题标题】:Converting (u)int64_t to NSNumbers将 (u)int64_t 转换为 NSNumbers
【发布时间】:2010-09-19 14:15:40
【问题描述】:

所以基本上我的问题是这样的,我正在使用 uint64_t 对象作为键创建一个 NSMutableDictionary。

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

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 对象/任何内容中,这将起作用。但是有没有更好的方法来做到这一点?我真的很想确保该对象是 64 位的,无论我在什么平台上运行它。

我想我可以通过始终使用 unsigned long long 来避免整个问题,但是如果我以任何重要数量分配这些对象,这当然会浪费 64 位机器上的大量堆空间......

【问题讨论】:

    标签: cocoa nsnumber uint64


    【解决方案1】:

    long long 在 64 位 OS X/iOS 平台上为 64 位。在所有 OpenStep 下降平台上,numberWithUnsignedLongLong:uint64_t 都是正确的。

    上次我检查过,你使用的工厂方法实际上并不影响使用的表示;它仅取决于数字的值(除非您使用的尺寸太小,导致它被截断)。

    更新:这几天,正确答案是NSNumber *bobsNumber = @(bob);

    【讨论】:

    • 无关紧要的原因是编译器最了解所用类型的实际位宽。如果它们不匹配,则将一个转换为另一个 - 通过剪切位或使用前导 0 扩展。
    • 你误会了。我在第二段中的意思是[NSNumber numberWithLongLong:73] 将产生与[NSNumber numberWithChar:73] 相同的对象,而不是一个由long long 返回的对象和另一个由char 支持的对象。现在我费心重新检查,10.6.4 中不是这种情况。 (您可以使用CFShow() 进行检查,它会告诉您内部表示。)
    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多