gpt4 book ai didi

iOS计算文件大小总和总是负数

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:59:38 41 4
gpt4 key购买 nike

我这里遇到了一个奇怪的问题,我确定这只是一些小问题。

我通过 JSON 接收有关文件的信息(RestKit 做得很好)。我通过 coredata 将每个文件的文件大小写入本地存储。

之后,在我的一个 View Controller 中,我需要总结数据库中所有文件的文件大小。我获取所有文件,然后通过一个斜坡 (for) 来总结大小。

现在的问题是,结果总是负的!

coredata 实体文件大小的类型为 Integer 32(文件大小由 JSON 以字节为单位报告)。我在 NSArray allPublicationsToLoad 中读取了 fetchresult,然后尝试总结。 CDPublication 类型的 NSArray 中的对象具有 NSNumber 类型的值 filesize:

for(int n = 0; n < [allPublicationsToLoad count]; n = n + 1)
{
CDPublication* thePub = [allPublicationsToLoad objectAtIndex:n];
allPublicationsSize = allPublicationsSize + [[thePub filesize] integerValue];
sum = [NSNumber numberWithFloat:([sum floatValue] + [[thePub filesize] floatValue])];

单个 CDPublications 对象的每个文件大小都是正确的。之后只有所有文件大小的总和为负。现在大约有 240 个文件大小值在 4000 到 234.645.434.123 之间的对象。

有人可以给我一个正确的方向吗!?是 Integer 32 或者 NSNumber 放不下这么大范围的问题吗?

谢谢

疯狂的应用程序

最佳答案

NSNumber 对象不能容纳这么大的数字。由于负数的存储方式,结果为负数。

负数使用 two's complement 存储,这样做是为了使正数和负数的加法更容易。 NSNumber 可以容纳的数字范围分为两部分,最高的一半(最高位等于 1 的 int 值)被认为是负数,最低的一半(最高位等于 0)是正常的正数。现在,如果您添加足够大的数字,结果将位于最高的一半,因此被解释为负数。这是 4 位整数情况的示例(32 的工作方式完全相同,但要输入的 0 和 1 会多很多;))

用 4 位你可以表示这个范围的有符号整数:

0000 (=0)
0001 (=1)
0010 (=2)
...
0111 (=7)

1000 (=-8)
1001 (=-7)
...
1111 (=-1)

在这种情况下,您可以表示的最大正整数是 7。例如,如果您将 5 和 4 相加,您将得到:

0101 + 0100 = 1001

当您像这样表示有符号整数时,1001 等于 -7(而不是您期望的 9)。这就是您正在观察的效果,但规模要大得多(32 位)

在这种情况下获得正确结果的唯一选择是增加用于表示整数的位数,这样结果就不会在位组合的负数范围内。因此,如果 32 位不够(如您的情况),您可以使用 long(64 位)。

[myNumber longLongValue];

关于iOS计算文件大小总和总是负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12161827/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com