Objective C - NSNumber存储和检索longLongValue的前缀始终为0xFFFFFFFF

时间:2013-07-23 18:49:46

标签: objective-c nsnumber long-long

我试图将文件大小以字节为单位存储为NSNumber。我正在从NSURLResponse读取文件下载大小,这给了我很长的值,然后我从该值创建一个NSNumber对象并存储它。当我稍后检索该值时,它会返回所有较高的字节设置为FFFFFFFF。

例如,我读取的大小为2196772870字节(0x82f01806),然后将其存储到NSNumber中。当我得到它时,我得到-2098194426字节(0xffffffff82f01806)。在将值存储在NSNumber之前,我尝试使用0x00000000FFFFFFFF执行二进制AND,但它仍然返回为负数。代码如下:

long long bytesTotal = response.expectedContentLength;
NSLog(@"bytesTotal = %llx",bytesTotal);
[downloadInfo setFileTotalSize:[NSNumber numberWithInt:bytesTotal]];
//[downloadInfo setFileTotalSize:[NSNumber numberWithLongLong:bytesTotal]];
long long fileTotalSize = [[downloadInfo fileTotalSize] longLongValue];        
NSLog(@"fileTotalSize = %llx",fileTotalSize);

输出:

bytesTotal = 82f01806
fileTotalSize = ffffffff82f01806

有什么建议吗?

编辑:完全忘记了downloadInfo对象的setter。

1 个答案:

答案 0 :(得分:1)

问题在于这一行:

[downloadInfo setFileTotalSize:[NSNumber numberWithInt:bytesTotal]];

bytesTotal不是int,而是long long,因此您应该使用numberWithLongLong:,而不是numberWithInt:。将其更改为:

[downloadInfo setFileTotalSize:[NSNumber numberWithLongLong:bytesTotal]];

转换导致它被符号扩展为64位,以8开头的数字似乎是负数,因此该位一直延伸到上部长,导致它为ffffffff。