在使用format arguments的时候,遇到了如题的编译器 warning, 当然Xcode也提供了Fix-it来解决。但作为一个合格的程序者,原理是一定要去探个究竟的,起码这点好奇心如果都没有,那在工作的路上一定会跪掉的。
不废话了,简单如下的demo,就可以重现这个问题。
NSInteger number = 5;
NSLog(@"%d", number);
[NSString stringWithFormat:@"%d", number];
果断去了SO查看,得到解答,跟度娘上所有的答案都很一致 (但是仍不能解决我的疑问)
http://stackoverflow.com/questions/16075559/why-does-an-nsinteger-variable-have-to-typecasted-to-type-long
首先来看NSInteger的定义(如下),在64位系统中NSInteger是long, 32位中是int。所以"%d"在64位上当然是不足以够位长,这里修改为"%ld"合情合理。
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
然后Xcode Fix-it推荐做法是下面这样。
[NSString stringWithFormat:@"%ld", (long)number];
然后我尝试去掉后面的long 转换,也编译通过。因为如果是64位,那number不需要转换,如果是32位,那number int值是可以自动转化为long的,那么Xcode为什么要推荐在后面转换呢? 不得其解,有知道的朋友告诉我,谢谢
[NSString stringWithFormat:@"%ld", number];