Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C:无符号整数比较_Objective C_Nsarray - Fatal编程技术网

Objective c 目标C:无符号整数比较

Objective c 目标C:无符号整数比较,objective-c,nsarray,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!"); } 正如我在这里

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

    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是将我的负数转换成一个“有符号”的整数,从而终止我的比较


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

试试这个

- (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的类型为有符号整数,数组计数的类型为无符号整数,
因此,它将把foo的数据类型转换为unsigned int
然后foo的值将变为一个大数字,它小于数组计数3。

因此,在本例中,需要将数组计数向下转换为有符号整数。


问题

当你的数组计数超过有符号整数的最大限制时,施放后,它会像[-(负)最大限制->0->+最大限制]那样进行取整,这是一个意外的结果。

解决方案

  • 如果不确定最大数组长度,请避免类型转换
  • 如果确定限制,请执行强制转换(最大数组长度不会超过signed int max limit)。

有关更多详细信息,请查看此

问题

您遇到的问题是,由于
foo
是一个有符号整数,并且
-[NSArray count]
返回一个无符号整数,
foo
正在进行隐式类型转换为无符号整数。有关更多信息,请参阅。另外,还有关于C中类型转换规则的更多信息

解决方案

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


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

编译器对此发出警告,但默认情况下不启用。转到目标的“生成设置”选项卡并搜索“符号比较”。打开编译器警告。这可能会导致很多警告。您可能需要重新考虑代码的用途,因为
count
没有签名,因此您的if子句基本上是一个死分支,可以删除。我通过按“next”或“prev”按钮来迭代数组,这些按钮更改索引变量。数组值需要循环,因此当索引小于0时,应将其设置为数组中的最后一个元素。如果索引大于数组长度,则应将其设置为0。所以可能有一种情况,索引是-1,我将它与数组长度进行比较,如上图所示。如果数组索引为0,并且用户点击“上一步”按钮,为什么不在该点将索引设置为max元素?类似地,如果索引是最大值,并且用户点击“下一步”按钮,则将索引设置为0。这样,索引总是引用一个有效的元素,同时可以避免这个问题。或者,使用模运算确定索引:
(计数器%array.count)
previous
next
递减和递增
计数器
,但是
计数器
的实际值并不重要,只要您避免溢出和下溢。@Caleb数组可以从4个不同的操作中更改,所以我只是简单地用++或-,索引,然后调用一个共享函数来计算显示,但事后看来,最好在点击前检查一下。谢谢你的意见+1
foo
已签名。没有必要在
foo
上施展演员阵容。这就是我一直在寻找的答案,正是如何让这种比较发挥作用的。谢谢@WilliamT:为什么需要将数组的计数与负数进行比较?数组的计数永远不能为负…@dreamlax有关我为什么要这样做的解释,请参阅根帖子中的注释。确切地说,在比较时,请确保两个操作数的类型完全相同。这就是答案不,这太疯狂了。正如@Caleb提到的,将数组的长度与
-1
进行比较并不意味着什么。使用
0
@Bhargavi卡尔说的话。整数不能存储-1,因为-1是负数。NSUTEGER只能存储非负数——同样,U表示无符号。