-1< 4返回NO?太奇怪了

时间:2013-01-17 03:38:40

标签: objective-c arrays

int counter=-1;
NSArray *pointArray=[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"1",@"2", nil];
NSString *result=[NSString stringWithFormat:@"%d",counter<pointArray.count-1];

信不信由你,结果是0 !!! 试试谁能告诉我为什么???

2 个答案:

答案 0 :(得分:3)

您将有符号数字(-1)与无符号数字(pointArray.count - 1)进行比较。

答案 1 :(得分:0)

请注意,以下代码重现了此问题:

#include <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
    NSUInteger uns = 4;
    int sig = -1;
    BOOL cmp = (sig < uns);
    NSLog(@"(%d<%zu)=%d", sig, uns, cmp);
}

这是

的输出
 (-1<4)=0

正如已经指出的那样,问题在于您要将intNSUInteger进行比较。但请记住,在64位系统上,NSUIntegertypedef of unsigned long

我们看到的行为是usual arithmetic conversion的结果:

  
      
  1. 如果任一操作数的类型为long double,则另一个操作数将转换为long double类型。
  2.   
  3. 如果不满足上述条件且操作数的类型为double,则另一个操作数将转换为double类型。
  4.   
  5. 如果不满足上述两个条件且操作数的类型为float,则另一个操作数将转换为float类型。
  6.   
  7. 如果不满足上述三个条件(没有任何操作数是浮点类型),则对操作数执行整数转换,如下所示:   
        
    • 如果任一操作数的类型为unsigned long,则另一个操作数将转换为unsigned long类型。
    •   
    • 如果不满足上述条件且操作数的类型为long而另一个操作数类型为unsigned int,则两个操作数都将转换为unsigned long类型。
    •   
    • 如果不满足上述两个条件,并且任一操作数的类型为long,则另一个操作数将转换为long类型。
    •   
    • 如果不满足上述三个条件,并且任一操作数的类型为unsigned int,则另一个操作数将转换为unsigned int类型。
    •   
    • 如果不满足上述条件,则两个操作数都将转换为int。
    •   
  8.   

由于两个操作数都不是浮点类型,我们到达4.。由于第二个操作数(pointArray.count-1)的类型为NSUInteger,类型为unsigned long,因此另一个操作数(counter)将转换为类型unsigned long,取值18446744073709551615的值确实大于4