2012-10-10 46 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.