我正在进行一些练习,并收到警告:
隐式转换失去整数精度'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;
}
答案 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];