You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何printf输出fffffff5而非-11?八进制输出异常解惑

问题:printf使用%x/%o输出-11为何得到非预期结果?

使用printf的%x格式符输出-11时,结果为fffffff5而非预期的-11;使用%o格式符输出-11时,结果为37777777765,相关代码及输出如下:

代码1(%x格式符)

#include<stdio.h>
int main()
{
    printf("%x",-11);
    return 0;
}

输出:

fffffff5

代码2(%o格式符)

#include<stdio.h>
int main()
{
    printf("%o",-11);
    return 0;
}

输出:

37777777765

原因解析
  • 格式符的类型匹配问题:%x是用于输出无符号十六进制整数的格式符,%o是用于输出无符号八进制整数的格式符,它们都期望接收无符号整数类型的参数。但你传入的是有符号负数-11,此时printf会将这个有符号数按照无符号数的规则解析。

  • 补码存储的影响:在C语言中,有符号整数是以补码形式存储在内存中的。以32位int类型为例:

    1. 11的二进制为:00000000 00000000 00000000 00001011
    2. 对其取反得到反码:11111111 11111111 11111111 11110100
    3. 反码加1得到-11的补码:11111111 11111111 11111111 11110101
  • 格式符解析补码:

    • 用%x解析该补码时,会将其当作无符号十六进制数转换,结果就是fffffff5。
    • 用%o解析时,将补码按三位一组拆分转换为八进制,结果就是37777777765。

如果想要输出带符号的数值,应该使用%d格式符;若要以十六进制/八进制形式显示负数的符号,需要手动处理(比如先判断符号,再输出负号加绝对值的进制转换结果)。


内容的提问来源于stack exchange,提问作者Archit sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:05:23