Objective C:Unsigned int compare

时间:2013-04-23 04:42:29

标签: objective-c nsarray

所以我在工作中遇到了一个很大的问题,因为我的代码中有这样的东西:

    int foo = -1;
    NSArray *bar = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
    if (foo > [bar count]){
        NSLog(@"Wow, that's messed up.");
    } else {
        NSLog(@"Rock on!");
    }

正如你可能已经知道我发布的那样,输出是:

“哇,这搞砸了。”

从我收集的内容来看,目标C正在将我的负数转换为“已签名”的int,从而杀死了我的比较。

我看到其他关于此的帖子,他们都说明了问题所在,但没有人提出任何简单的解决方案来实现这种比较。此外,我感到震惊的是没有编译器警告,因为这些警告对我来说是严重的问题。

2 个答案:

答案 0 :(得分:11)

问题

您遇到的问题是,因为foo是有符号整数而-[NSArray count]返回无符号整数,foo正在进行无符号整数的隐式类型转换。有关详细信息,请参阅Implicit Type Conversion。此外,还有关于C here中的类型转换规则的更多信息。

解决方案

-[NSArray count]返回无符号值,因为数组永远不会有负数的元素;最小可能值为0.将数组的计数与-1进行比较并没有多大意义 - 计数总是大于任何负数(尽管有符号问题)。

因此,这里正确的解决方案以及避免这些问题的方法是使用与-[NSArray count]的返回值匹配的类型,即NSUInteger(U代表无符号)。

答案 1 :(得分:9)

试试这个

- (IBAction)btnDoSomething:(id)sender {
        int foo = -1;
        NSArray *bar = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
        if ( foo > (signed)[bar count] ) {
            NSLog(@"Wow, that's messed up.");
        } else {
            NSLog(@"Rock on!");
        }
    }

<强>工作

如果您要比较两种不同类型的变量,那么它将隐式地将两个变量的数据类型转换为更高类型的变量
在这个例子中,
变量foo的类型为 signed int ,数组计数为 unsigned int
因此它会将foo的数据类型转换为 unsigned int
然后foo的值将变为大数,小于数组计数3。

因此,在此示例中,您需要将数组计数向下转换为 signed int


问题

当你的数组计数超过signed int的最大限制时,然后在转换后它将向后舍入,如[ - (负)最大限制 - > 0 - &gt; +最大限制]这是意料之外的结果。

的解决方案

  • 如果您不确定最大阵列长度,请避免使用类型转换。
  • 如果您确定限制,则进行投射(最​​大阵列长度不超过 signed int 最大限制)。

有关详细信息,请查看此内容 http://visualcplus.blogspot.in/2006/02/lesson-4-casting-data-types.html