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个不同的操作中更改,所以我只是简单地用++或-,索引,然后调用一个共享函数来计算显示,但事后看来,最好在点击前检查一下。谢谢你的意见+1foo
已签名。没有必要在foo
上施展演员阵容。这就是我一直在寻找的答案,正是如何让这种比较发挥作用的。谢谢@WilliamT:为什么需要将数组的计数与负数进行比较?数组的计数永远不能为负…@dreamlax有关我为什么要这样做的解释,请参阅根帖子中的注释。确切地说,在比较时,请确保两个操作数的类型完全相同。这就是答案不,这太疯狂了。正如@Caleb提到的,将数组的长度与-1
进行比较并不意味着什么。使用0
@Bhargavi卡尔说的话。整数不能存储-1,因为-1是负数。NSUTEGER只能存储非负数——同样,U表示无符号。