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

为何char类型变量的printf输出为4字节十六进制值而非预期1字节?

为什么char类型变量用printf输出会得到4字节十六进制值?

问题重现

运行以下代码:

char num = -25;
char *ptr = #
printf("%02X", *ptr);

实际输出:FFFF FFE7,但预期输出为E7。

核心原因

问题根源在于C语言的整型默认提升规则:

  • 向printf这类可变参数函数传递小于int的整型类型(如char、short)时,编译器会自动将其提升为int类型。
  • 多数系统中char属于有符号类型(signed char),-25的二进制表示是11100111(十六进制E7)。由于是有符号数,提升为int时会执行符号扩展——把最高位的符号位(1)填充到扩展的高位字节中,最终生成32位的11111111 11111111 11111111 11100111,对应十六进制就是FFFFE7。
  • printf的%X格式符用于输出无符号int类型,因此会将扩展后的32位值完整打印,就出现了你看到的4字节结果。

解决方法

有两种方式可以得到预期的1字节输出:

  1. 将char声明为无符号类型:
unsigned char num = -25; // 自动转换为对应无符号值231(0xE7)
unsigned char *ptr = #
printf("%02X", *ptr);
  1. 在传递参数时强制转换为unsigned char,避免符号扩展:
char num = -25;
char *ptr = #
printf("%02X", (unsigned char)*ptr);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:14:58