@_@646 2025-09-16 17:58 采纳率: 0%
浏览 6

NsLog打印 负值有问题

操作系统:macos 14.1
xcode: 版本 15.01

问题现象:Nslog 在Macos上 控制台打印负值的时候有问题,会以补码的形式打印出现,
代码如下:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
            int testNumber = -7;

    
        NSLog(@"=== NSLOG TESTS ===");
        NSLog(@"%%d: %d", testNumber);
        NSLog(@"%%i: %i", testNumber);
        NSLog(@"%%u: %u", testNumber); 

      
        printf("\n=== PRINTF TESTS ===\n");
        printf("%%d: %d\n", testNumber);
        printf("%%i: %i\n", testNumber);

     
        printf("\n=== DIRECT VALUE TESTS ===\n");
        printf("Direct printf: %d\n", -7);
        NSLog(@"Direct NSLog: %d", -7);

     
        printf("\n=== MEMORY REPRESENTATION ===\n");
        printf("Hex of -7 (%%x): 0x%x\n", testNumber);
        NSLog(@"Hex of -7 (%%x): 0x%x", testNumber);
    }
    return 0;
}
运行结果如下:

=== PRINTF TESTS ===
%d: -7
%i: -7

=== DIRECT VALUE TESTS ===
Direct printf: -7

=== MEMORY REPRESENTATION ===
Hex of -7 (%x): 0xfffffff9
=== NSLOG TESTS ===
%%d: 18,446,744,073,709,551,609
%%i: 18,446,744,073,709,551,609
%%u: 4,294,967,289
Direct NSLog: 18,446,744,073,709,551,609
Hex of -7 (%%x): 0xfffffff9
Program ended with exit code: 0

这是为什么?

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-09-16 17:58
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    NSLog 在 macOS 上打印负值的bug主要是由于其内部的实现问题导致的补码表示形式打印出去了。

    可以使用以下几种解决方案:

    方案1: 使用l格式符号

    你可以使用l格式符号来打印出整数值的十进制表示形式:

    NSLog(@"负值:%lld", -2147483648);
    

    方案2: 使用C的printf函数

    如果你需要在C语言代码中打印负值,可以使用C的printf函数:

    printf("%d\n", -2147483648);
    

    方案3: 使用NSString的格式化字符串

    如果你使用Objective-C,可以使用 NSString 的格式化字符串来打印出负值:

    NSString *str = [NSString stringWithFormat:@"%lld", -2147483648];
    NSLog(@"%@", str);
    

    上述方案中,最简洁的应该是使用 l 格式符号或 NSString 的格式化字符串了。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月16日