首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当用作格式参数时,为什么NSInteger变量必须转换为long?

当用作格式参数时,为什么NSInteger变量必须转换为long?
EN

Stack Overflow用户
提问于 2013-04-18 14:01:19
回答 5查看 45.4K关注 0票数 145
代码语言:javascript
复制
NSInteger myInt = 1804809223;
NSLog(@"%i", myInt); <==== 

上面的代码产生了一个错误:

“NSInteger”“类型的长值不应用作格式参数;请改为将显式强制转换为”“

”“

更正后的NSLog消息实际上是NSLog(@"%lg", (long) myInt);。如果我想要显示myInt的整数值,为什么必须将其转换为long

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-18 14:43:36

如果在OS (64位)上编译,则会收到此警告,因为在该平台上,NSInteger被定义为long,是一个64位整数。另一方面,%i格式是用于32位int的。因此,格式和实际参数的大小不匹配。

由于NSInteger是32位还是64位,取决于平台,编译器通常建议向long添加强制转换。

更新:由于iOS 7现在也支持64位,因此在为iOS编译时也会收到同样的警告。

票数 194
EN

Stack Overflow用户

发布于 2013-04-18 15:29:22

如果您的格式说明符与您的数据类型匹配,则不必强制转换为任何类型。请参阅Martin R的答案,了解有关如何根据本机类型定义NSInteger的详细信息。

因此,对于打算为64位环境构建的代码,您可以像这样编写日志语句:

代码语言:javascript
复制
NSLog(@"%ld",  myInt); 

而对于32位环境,您可以这样写:

代码语言:javascript
复制
NSLog(@"%d",  myInt); 

并且它将在没有强制转换的情况下工作。

使用强制转换的一个原因是,好的代码往往是跨平台移植的,如果你显式地转换你的变量,它将在32位和64位上干净地编译:

代码语言:javascript
复制
NSLog(@"%ld",  (long)myInt);

请注意,这不仅适用于NSLog语句,毕竟它们只是调试辅助工具,而且还适用于[NSString stringWithFormat:]和各种派生消息,它们是生产代码的合法元素。

票数 39
EN

Stack Overflow用户

发布于 2014-01-30 19:15:25

不需要将NSInteger传递给NSLog,只需传递NSNumber即可。这将绕过所有类型转换并选择正确的字符串格式说明符。

代码语言:javascript
复制
NSNumber foo = @9000;
NSLog(@"foo: %@", foo);
NSInteger bar = 9001;
NSLog(@"bar: %@", @(bar));

它也适用于NSUIntegers,而不必担心这一点。请参阅NSInteger and NSUInteger in a mixed 64bit / 32bit environment的答案

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16075559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档