最近我遇到了比较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.count
是unsigned long
)。
但是,这种错误很难发现(代码编译,没有警告,你可能没有注意到array.count
是无符号的,这很重要)。 问题是如何避免这种情况?有没有比较有符号和无符号值的安全方法?
为什么NSLog(@"%d", array.count - 2)
打印-2
?
答案 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。