5

最近我在objective-c中比较有符号和无符号值时遇到了问题。下面是这个问题的一个例子:

NSArray *array = [NSArray array];
NSLog(@"Count = %d", array.count);
NSLog(@"Count - 2 = %d", array.count - 2);
if (array.count - 2 > 0) {
    NSLog(@"A");
} else {
    NSLog(@"B");
}

乍一看似乎应该打印以下代码B。但是,当您运行它时,您会看到:

Count = 0
Count - 2 = -2
A

现在我知道问题在于比较有符号和无符号值(array.countis unsigned long)。

然而,这种错误很难发现(代码编译,没有警告,你可能没有注意到它array.count是无符号的,它很重要)。问题是我怎样才能避免这种情况?有比较有符号和无符号值的安全方法吗?

这也很有趣,为什么要NSLog(@"%d", array.count - 2)打印-2

4

3 回答 3

4

首先,比较有符号和无符号数字是不安全的,在您的情况下array.count - 2是无符号数字。

其次,它打印-2 是因为您使用%d了它是有符号整数的格式化程序。要打印无符号整数,请使用%u.

于 2012-10-10T08:11:37.413 回答
4

有一个编译器选项 ,-Wsign-conversion它会警告您潜在的签名问题。在 Xcode 中,您可以在 Build Settings 的 Implicit Signedness Conversion 下找到它。

于 2012-10-10T08:14:02.507 回答
1

当你在这里

NSLog(@"%d", array.count - 2);

由于它是指定的格式,因此您的 %d 变为有符号/无符号整数。所以它打印-2。

同样,您可以进行比较。

int count = array.count - 2;
if (count > 0) 
{
    NSLog(@"A");
} 
else 
{
    NSLog(@"B");
}

这应该打印 B。

于 2012-10-10T08:13:21.540 回答