【问题标题】:Comparing signed and unsigned values in objective-c比较objective-c中的有符号和无符号值
【发布时间】:2012-09-30 15:40:28
【问题描述】:

最近我在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 也很有趣?

【问题讨论】:

    标签: objective-c ios cocoa-touch unsigned signed


    【解决方案1】:

    首先,比较有符号和无符号数字是不安全的,在您的情况下,array.count - 2 是一个无符号数字。

    其次,它会打印-2,因为您使用了%d,它是有符号整数的格式化程序。要打印无符号整数,请使用%u

    【讨论】:

      【解决方案2】:

      当你在这里

      NSLog(@"%d", array.count - 2);
      

      因为它是一种指定的格式,你的 %d 变成一个整数,有符号/无符号。所以它打印 -2。

      同样,您可以进行比较。

      int count = array.count - 2;
      if (count > 0) 
      {
          NSLog(@"A");
      } 
      else 
      {
          NSLog(@"B");
      }
      

      这应该打印 B。

      【讨论】:

        【解决方案3】:

        有一个编译器选项-Wsign-conversion,它会警告您潜在的签名问题。在 Xcode 中,您可以在 Build Settings 的 Implicit Signedness Conversion 下找到它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-28
          • 2011-07-21
          • 2015-10-31
          • 1970-01-01
          • 2012-07-28
          • 2019-07-11
          • 2016-08-07
          相关资源
          最近更新 更多