10

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

    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 正在将我的负数转换为“有符号”整数,从而扼杀我的比较。

我看到了其他有关此的帖子,他们都说明了问题所在,但没有人提出任何简单的解决方案来使这种比较真正起作用。另外,我很震惊没有编译器警告,因为这些给我带来了严重的问题。

4

2 回答 2

11

问题

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

解决方案

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

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

于 2013-04-23T05:07:39.047 回答
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 是有符号 int类型,数组 count 是unsigned int
所以它会将 foo 的数据类型转换为unsigned int
然后 foo 的值将变成一个大数字,它小于数组 count 3。

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


问题

当您的数组计数超过有符号 int 的最大限制时,在转换后它将像 [ -(negative) max limit -> 0 -> + max limit ] 一样四舍五入,这是意想不到的结果。

解决方案

  • 如果您不确定最大数组长度,请避免类型转换。
  • 如果您确定有限制,请进行强制转换(最大数组长度不会超过带符号的 int最大限制)。

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

于 2013-04-23T04:48:20.770 回答