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
相关产品推荐
相关产品推荐

