Objective C:Unsigned int compare

Wil*_* T. 10 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!");
    }
Run Code Online (Sandbox Code Playgroud)

你可能已经知道我发布这个,输出是:

"哇,这搞砸了."

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

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

Cal*_*leb 11

问题

您遇到的问题是因为foo是有符号整数并-[NSArray count]返回无符号整数,foo正在进行无符号整数的隐式类型转换.有关详细信息,请参阅隐式类型转换.此外,还有约在C类转换规则的详细信息在这里.

解决方案

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

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

  • 确切地说,**当你比较时确保两个操作数都是完全相同的类型**.这就是答案 (2认同)

Nav*_*dse 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!");
        }
    }
Run Code Online (Sandbox Code Playgroud)

工作

如果要比较两种不同类型的变量,那么它将隐式地将两个变量的数据类型转换为更高类型的变量.

在此示例中,
变量foo是类型的符号的int和数组计数是无符号整型,
所以它会转换到FOO的数据类型无符号整型
然后FOO的值将变大数目,这是比较小的阵列计数3.

在此所以例如,您需要将数组计数向下转换为signed int.


问题

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

  • 如果您不确定最大阵列长度,请避免使用类型转换.
  • 如果您确定限制,则进行强制转换(最大数组长度不会超过有符号的最大上限).

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

  • @WilliamT.:为什么需要将数组的数量与负数进行比较?数组的计数可以*永远不会是负数...... (3认同)
  • `foo`已经签名了.没有必要在'foo`上施放. (2认同)