目标c隐式转换丢失整数精度'NSUInteger'(又名'unsigned long')为'int'警告
我正在通过一些练习,并得到一个警告,指出:
隐式转换失去整数精度'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; }
NSArray
的count
方法返回一个NSUInteger
,并在64位OS X平台上
-
NSUInteger
被定义为unsigned long
,并且 -
unsigned long
是一个64位无符号整数。 -
int
是一个32位整数。
所以int
是比NSUInteger
更小的数据types,因此编译器警告。
另请参见“基础数据types参考”中的NSUInteger :
在构build32位应用程序时,NSUInteger是一个32位无符号整数。 一个64位应用程序将NSUInteger视为一个64位无符号整数。
要修复该编译器警告,可以将本地count
variables声明为
NSUInteger count;
或者(如果你确信你的数组永远不会包含超过2^31-1
元素!),添加一个显式的强制转换:
int count = (int)[myColors count];
与马丁的答案相反,即使你知道你的数组没有超过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]); }
在项目>生成设置中更改键“检查printf / scanf : NO ”
说明: [它如何工作]
检查对printf和scanf等的调用,以确保提供的参数具有与指定的格式string相匹配的types,并且格式string中指定的转换是有意义的。
希望它的工作
其他警告
目标c隐式转换失去整数精度'NSUInteger'(又名'unsigned long')为'int
更改键“ 隐式转换为32位types>debugging> * 64架构:否 ”
[ 注意:这可能会使64位体系结构转换的其他警告无效] 。
对我的情况做expicit铸造“int”解决了这个问题。 我遇到过同样的问题。 所以:
int count = (int)[myColors count];