所以我在工作中遇到了一个很大的问题,因为我的代码中有这样的东西:
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,从而杀死了我的比较。
我看到其他关于此的帖子,他们都说明了问题所在,但没有人提出任何简单的解决方案来实现这种比较。此外,我感到震惊的是没有编译器警告,因为这些警告对我来说是严重的问题。
答案 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; +最大限制]这是意料之外的结果。
的解决方案的
有关详细信息,请查看此内容 http://visualcplus.blogspot.in/2006/02/lesson-4-casting-data-types.html