objective c隐式转换丢失整数精度'NSUInteger'(又名'unsigned long')到'int'警告

时间:2013-06-04 13:13:39

标签: objective-c compiler-warnings implicit-conversion

我正在进行一些练习,并收到警告:

隐式转换失去整数精度'NSUInteger'(又名'unsigned long')到'int'

我很喜欢这个菜鸟,非常感谢任何帮助..谢谢。

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])

{
    @autoreleasepool {


        NSArray *myColors;

        int i;
        int count;

        myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];

        count = myColors.count; //  <<< issue warning here

        for (i = 0; i < count; i++)

        NSLog (@"Element %i = %@", i, [myColors objectAtIndex: i]);

    }


return 0;

}

Screenshot

4 个答案:

答案 0 :(得分:448)

count NSArray方法返回NSUInteger,并在64位OS X平台上

  • NSUInteger定义为unsigned long
  • unsigned long是64位无符号整数。
  • int是32位整数。

所以int是一个比NSUInteger“更小”的数据类型,因此是编译器警告。

另请参阅“基础数据类型参考”中的NSUInteger

  

构建32位应用程序时,NSUInteger是32位无符号   整数。 64位应用程序将NSUInteger视为64位无符号   整数。

要修复该编译器警告,您可以将本地count变量声明为

NSUInteger count;

或(如果您确定您的数组永远不会包含超过2^31-1个元素!), 添加一个显式的强制转换:

int count = (int)[myColors count];

答案 1 :(得分:24)

与Martin的回答相反,即使你知道你的数组没有超过2 ^ 31-1个元素,转换为int(或忽略警告)并不总是安全的。不是在编译64位时。

例如:

NSArray *array = @[@"a", @"b", @"c"];

int i = (int) [array indexOfObject:@"d"];
// indexOfObject returned NSNotFound, which is NSIntegerMax, which is LONG_MAX in 64 bit.
// We cast this to int and got -1.
// But -1 != NSNotFound. Trouble ahead!

if (i == NSNotFound) {
    // thought we'd get here, but we don't
    NSLog(@"it's not here");
}
else {
    // this is what actually happens
    NSLog(@"it's here: %d", i);

    // **** crash horribly ****
    NSLog(@"the object is %@", array[i]);
}

答案 2 :(得分:4)

更改项目中的键&gt;构建设置 “ typecheck调用printf / scanf

说明: [工作原理]

检查对printf和scanf等的调用,以确保提供的参数具有适合指定格式字符串的类型,并且格式字符串中指定的转换有意义。

希望它有用

其他警告

目标c隐式转换失去整数精度'NSUInteger'(又名'unsigned long')到'int

更改密钥“隐式转换为32位类型&gt;调试&gt; * 64架构:否

[警告:它可能会使64位架构转换的其他警告无效]

答案 3 :(得分:2)

对“int”进行expicit强制转换解决了我的问题。我遇到过同样的问题。所以:

int count = (int)[myColors count];