为何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字节输出:
- 将
char声明为无符号类型:
unsigned char num = -25; // 自动转换为对应无符号值231(0xE7) unsigned char *ptr = # printf("%02X", *ptr);
- 在传递参数时强制转换为
unsigned char,避免符号扩展:
char num = -25; char *ptr = # printf("%02X", (unsigned char)*ptr);
内容的提问来源于stack exchange,提问作者Emre
相关产品推荐
相关产品推荐

