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

-Wsign-conversion潜在的な符号の問題について警告するコンパイラオプションがあります。Xcodeでは、ビルド設定の暗黙的な符号変換の下にあります。

于 2012-10-10T08:14:02.507 に答える
4

まず、符号付きと符号なしの数値を比較するのは安全ではなく、あなたの場合array.count - 2は符号なしの数値です。

次に、符号付き整数のフォーマッタを-2 使用したため、出力されます。%d符号なし整数を出力するには、 を使用します%u

于 2012-10-10T08:11:37.413 に答える
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 に答える