Xcode 15中NSLog使用%d无法打印负整数的问题求助
Xcode 15中NSLog的%d格式符异常问题及解决
在Xcode 15开发Objective-C时,发现NSLog使用%d格式符打印负数时出现异常,测试代码如下:
int someInt = -1; NSLog(@"AppDelegate status: %d (%d) ((%.0f)) %@ -> %d)" , someInt, -1, someInt * 1.0, [NSString stringWithFormat:@"%d", someInt], [NSString stringWithFormat:@"%d", someInt].intValue);
日志输出结果:
AppDelegate status: 18,446,744,073,709,551,615 (18,446,744,073,709,551,615) ((-1.0000)) -1 -> 18,446,744,073,709,551,615)
现象总结
- 使用
%d直接打印-1或int类型变量时,输出为18446744073709551615(无符号64位整数最大值UINT64_MAX) - 将数值转为
float用%f打印,能正确显示-1.0000 - 通过
NSString的stringWithFormat:@"%d"能正确生成@"-1",但将该字符串转回intValue后用%d打印,依然出现异常 - 对比之下,使用
printf搭配%d打印-1是正常的
问题原因
这并非Xcode设置问题,而是Xcode 15中Clang编译器的行为变化:使用NSLog时,int类型参数会被提升为long long,但%d格式符被按无符号方式解析,导致负数的补码被当作无符号数输出。
解决方法
- 匹配格式符与参数类型:将
%d替换为%i,或使用对应long long类型的%lld,确保格式符与参数提升后的类型匹配:NSLog(@"AppDelegate status: %i (%i) ((%.0f)) %@ -> %i)" , someInt, -1, someInt * 1.0, [NSString stringWithFormat:@"%d", someInt], [NSString stringWithFormat:@"%d", someInt].intValue); - 强制转换参数类型:将
int变量强制转为long或long long后打印:NSLog(@"someInt: %d", (long)someInt); - 直接打印中转字符串:既然
stringWithFormat:@"%d"能正确生成目标字符串,直接打印该字符串即可规避格式解析问题。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

