首页 > 解决方案 > 将 MAX 与 unsigned long 和 unsigned long 减法一起使用

问题描述

' NSArrayscount是一个NSUInteger. 当数组为时,以下行设置-1p(乍一看,有人会猜到p会变成0)。

NSInteger p = MAX(0, array.count - 1)

我假设,原因是宏将array.count - 1其解释MAX为 18446744073709551615 而不是-1,因此它将此值返回为大于二的值,但是因为p是 a long,所以它将大数转换为-1。我在这里错了吗?

那么,使用 MAX 比较整数是否安全?

例如,可以编写一个循环,在特定情况下,当 时a.count == 0,直观上看起来像是立即退出,但实际上是在进行无数次迭代,冻结或崩溃设备。这是因为约束被解释为w < 18446744073709551615

NSMutableArray *a = [NSMutableArray arrayWithCapacity:10];
for(NSInteger w = 0; w < MAX(0, a.count-1); w++)
{
    NSLog(@"w = %li",w);
}

我想,一个安全的方法是这样写:

NSInteger q = array.count - 1;
NSInteger p = MAX(0, q);

...这会将零设置为p.

标签: objective-ctype-conversion

解决方案


使用MAX即保存。使用不安全.count - 1

你的周期应该是:

for(NSInteger w = 0; 1 + w < a.count; ++w)
{
    NSLog(@"w = %li",w);
}

推荐阅读