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

C语言十六进制输出疑问:为何char变量a输出0xFFFFFFA0而int变量b输出0xA0?

问题解答:char与int输出十六进制的差异

这事儿其实是有符号char的符号扩展和C语言中可变参数函数的类型提升规则在搞鬼,我来给你拆解清楚:

1. 先搞懂char的默认类型

在绝大多数编译器里,char默认是有符号类型(也就是signed char)。你给a赋值的0xA0,转换成二进制是10100000——最高位是1,这意味着对于有符号char来说,这是一个负数(补码表示下,符号位为1代表负数)。

2. printf的类型提升坑

printf是可变参数函数,当你传入char类型的变量时,它会自动把这个变量提升为int类型。这里的关键是:

  • 对于有符号数的类型提升,会执行符号扩展:把原类型的符号位(这里是1)填充到扩展后的所有高位。
  • 8位的10100000扩展成32位int后,就变成了11111111 11111111 11111111 10100000,对应十六进制就是0xFFFFFFA0,这就是你看到的a的输出结果。

3. int变量b为什么正常?

你给int b赋值的0xA0,本身就是32位的00000000 00000000 00000000 10100000,它的最高位是0,属于正数。用%x输出时,前面的零会被省略,所以直接显示0xA0。

验证方法(解决/验证这个现象)

如果你想让char类型的a也输出0xA0,有两种办法:

  • 把char改成无符号类型:
#include <stdio.h>
int main() {
    unsigned char a = 0xA0; // 无符号char,符号位不再起作用
    int b = 0xA0;
    printf("a = %x\n", a); // 输出0xA0
    printf("b = %x\n", b); // 输出0xA0
}
  • 用%hhx格式符指定输出char类型的十六进制,避免类型提升:
#include <stdio.h>
int main() {
    char a = 0xA0;
    int b = 0xA0;
    printf("a = %hhx\n", a); // 直接输出char的8位十六进制,结果是0xA0
    printf("b = %x\n", b); // 输出0xA0
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:37:15