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

使用printf的%ld打印负数未显式强转为何输出无符号值?

为什么printf("%ld", -1)输出UINT_MAX而非-1?

我做了以下测试:

printf("%ld", -1); // 输出 4294967295 (UINT_MAX)
printf("%ld", (long) -1); // 输出 -1

为什么没有显式类型转换时,打印的是UINT_MAX而不是实际的-1?我原本期望两者都输出-1。


这事儿核心是类型不匹配和C语言的整数规则导致的:

  • %ld是专门用来打印long类型有符号整数的格式符,它要求对应的参数必须是long类型。
  • 未加转换的-1默认是int类型,和%ld要求的类型不匹配,这属于C语言里的「未定义行为」——理论上标准没规定具体输出,但多数系统里会出现你看到的情况:
    • int类型的-1在二进制中是全1(比如32位系统下就是32个连续的1)。
    • 当printf用%ld去解析这个int类型的值时,会因为类型不匹配错误地把这串二进制当作无符号整数解读,32位全1的无符号数就是4294967295(也就是UINT_MAX)。
  • 当你显式把-1转换成long类型后,参数类型和%ld完全匹配,printf会正确识别这串全1的二进制是有符号数的-1,所以输出符合预期。

内容的提问来源于stack exchange,提问作者Cab the Kid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:55:17