NSInteger myInt = 1804809223;
NSLog(@"%i", myInt); <====
上面的代码产生了一个错误:
“NSInteger”“类型的长值不应用作格式参数;请改为将显式强制转换为”“
”“
更正后的NSLog
消息实际上是NSLog(@"%lg", (long) myInt);
。如果我想要显示myInt
的整数值,为什么必须将其转换为long
?
发布于 2013-04-18 14:43:36
如果在OS (64位)上编译,则会收到此警告,因为在该平台上,NSInteger
被定义为long
,是一个64位整数。另一方面,%i
格式是用于32位int
的。因此,格式和实际参数的大小不匹配。
由于NSInteger
是32位还是64位,取决于平台,编译器通常建议向long
添加强制转换。
更新:由于iOS 7现在也支持64位,因此在为iOS编译时也会收到同样的警告。
发布于 2013-04-18 15:29:22
如果您的格式说明符与您的数据类型匹配,则不必强制转换为任何类型。请参阅Martin R的答案,了解有关如何根据本机类型定义NSInteger
的详细信息。
因此,对于打算为64位环境构建的代码,您可以像这样编写日志语句:
NSLog(@"%ld", myInt);
而对于32位环境,您可以这样写:
NSLog(@"%d", myInt);
并且它将在没有强制转换的情况下工作。
使用强制转换的一个原因是,好的代码往往是跨平台移植的,如果你显式地转换你的变量,它将在32位和64位上干净地编译:
NSLog(@"%ld", (long)myInt);
请注意,这不仅适用于NSLog语句,毕竟它们只是调试辅助工具,而且还适用于[NSString stringWithFormat:]
和各种派生消息,它们是生产代码的合法元素。
发布于 2014-01-30 19:15:25
不需要将NSInteger传递给NSLog,只需传递NSNumber即可。这将绕过所有类型转换并选择正确的字符串格式说明符。
NSNumber foo = @9000;
NSLog(@"foo: %@", foo);
NSInteger bar = 9001;
NSLog(@"bar: %@", @(bar));
它也适用于NSUIntegers,而不必担心这一点。请参阅NSInteger and NSUInteger in a mixed 64bit / 32bit environment的答案
https://stackoverflow.com/questions/16075559
复制相似问题