比较objective-c中的有符号和无符号值

时间:2012-10-10 08:06:19

标签: objective-c ios cocoa-touch unsigned signed

最近我遇到了比较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.countunsigned long)。

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

为什么NSLog(@"%d", array.count - 2)打印-2

也很有趣

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

这时你

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

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

同样,您可以进行比较。

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

这应该打印B。