C语言int转short后printf打印十六进制出现4字节结果问题咨询
问题根因
- C语言的可变参数函数(比如
printf)存在默认参数提升规则:所有长度小于int的整数类型(包括short、char)在传参时,都会被自动转换为int类型再传入函数。 - 绝大多数编译器默认
short为有符号类型,你代码里的53191十六进制为0xcfc7,对应16位有符号数的最高位为1,属于负数。当有符号的short提升为32位int时会触发符号扩展,高位全部补1,最终得到的int值为0xffffcfc7。 %x格式符默认对应参数类型为unsigned int,会直接读取完整的32位值按十六进制打印,所以最终输出4字节长度的结果。
修复方案
你可以任选以下任意一种方案得到2字节的十六进制输出:
- 使用专门匹配
short类型的格式符%hx,明确告知printf按短整型解析参数:printf("s = %hx",s); // 输出结果为cfc7 - 打印时将参数强制转换为
unsigned short,避免符号扩展:printf("s = %x", (unsigned short)s); // 输出结果为cfc7
内容的提问来源于stack exchange,提问作者Hafeez
相关产品推荐
相关产品推荐

