[英]objective-c - how to convert between signed base 10 numbers and unsigned base 16
[英]Comparing signed and unsigned values in 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.count
是unsigned long
)。
但是,这种错误很难发现(代码编译,没有警告,你可能没有注意到array.count
是无符号的,这很重要)。 问题是如何避免这种情况? 有没有比较有符号和无符号值的安全方法?
NSLog(@"%d", array.count - 2)
打印-2
原因也很有趣?
首先,比较有符号和无符号数是不安全的,在你的情况下, array.count - 2
是无符号数。
其次,它打印-2
因为您使用了%d
,它是有符号整数的格式化程序。 要打印无符号整数,请使用%u
。
有一个编译器选项-Wsign-conversion
,可以警告您潜在的签名问题。 在Xcode中,您可以在Build Settings中的Implicit Signedness Conversion下找到它。
在这里当你
NSLog(@"%d", array.count - 2);
因为它是指定的格式,所以%d变为有符号/无符号的整数。 所以它打印-2。
同样,您可以进行比较。
int count = array.count - 2;
if (count > 0)
{
NSLog(@"A");
}
else
{
NSLog(@"B");
}
这应该打印B.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.