将uint64_t转换为NSNumber

时间:2016-06-20 22:34:20

标签: ios objective-c

以下代码:

- (id)initWithMediaCollection:(MPMediaItemCollection *)mediaCollection collectionCategory:(NSString *)collectionCategory
{
    self = [super init];
    if (self) {
        _mediaCollection = mediaCollection;
        uint64_t persistentID = mediaCollection.persistentID;
        _collectionID = [NSNumber numberWithUnsignedLongLong:persistentID];
    }
    return self;
}

我调试然后设置断点。这个init方法第一次运行时,它运行正常:

  

persistentID uint64_t 6071794744315787357

     

_collectionID __NSCFNumber *(长)6071794744315787357

第二次,我得到了这些值:

  

persistentID uint64_t 14938043870126423662

     

_collectionID __NSCFNumber *(长)-3508700203583127954

第二次为什么值不相同?当我明确地将其声明为无符号时,为什么它是否定的?

2 个答案:

答案 0 :(得分:0)

numberWithUnsignedLongLong工作正常。很大程度上取决于你打印它的确切程度。你方便地省略了。

答案 1 :(得分:0)

区别在于NSInteger是“已签名”值,而uint64_t则不是。在上面的两个值之间,二进制表示都是:

1100111101001110100101111100000100110110000101100011111001101110 1100111101001110100101111100000100110110000101100011111001101110

根据这两个网站:

这是一个如何以二进制位表示数字的链接: https://en.wikipedia.org/wiki/Signed_number_representations