2012-10-10 42 views
4

最近我遇到了一个问题,比较有符号和Objective-C中的无符号值。下面是这个问题的一个例子:比较有符号和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

有一个编译器选项,-Wsign-conversion,警告您潜在的符号性问题。在Xcode中,您可以在Build Settings的隐式签名转换下找到它。

4

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

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

1

在这里,当你

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

,因为它是指定的格式,您%d成了一个整数的符号/无符号。所以它打印-2。

同样可以进行比较。

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

这应该打印B.