繁体   English   中英

比较objective-c中的有符号和无符号值

[英]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.countunsigned 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM