请帮助我理解该程序的输出:
int main()
{
char a = 0x99;
printf("%02x\n", a);
return 0;
}
输出:
ffffff99
为什么输出会那样?
答案 0 :(得分:4)
有几个因素在起作用。首先,在您的计算机上,普通char
是签名类型,而不是无符号类型。另一方面,像printf()
这样的可变函数的参数会经历整数提升规则,因此您的char
会转换为int
,并且因为它已签名,0x99
为char
1}}是一个负数,因此它会被符号扩展为0xFFFFFF99
,因此会被打印出来。
要获得您期望的结果,请使用以下方法之一:
printf("%02x", (unsigned char)a);
printf("%02x", a & 0xFF);
答案 1 :(得分:1)
如果您的目标是打印十六进制值,则需要将变量声明为 uint8_t 这基本上是一个字节,只需将其打印如下
#include <stdio.h>
#include <stdint.h>
int main(void)
{
uint8_t a=0x99;
printf("%x",a);
}
答案 2 :(得分:0)
请阅读以下整数推广。
如果两个操作数具有相同的类型,则不需要进一步转换。
否则,如果两个操作数都有有符号整数类型或两者都有无符号 整数类型,具有较小整数转换等级类型的操作数是 转换为具有更高等级的操作数的类型。
否则,如果具有无符号整数类型的操作数的等级大于或等于 等于另一个操作数的类型的等级,然后是操作数 有符号整数类型转换为带有unsigned的操作数的类型 整数类型。
否则,如果带有符号整数类型的操作数的类型可以表示 那么,带有无符号整数类型的操作数类型的所有值 具有无符号整数类型的操作数将转换为该类型 带有符号整数类型的操作数。
否则,两个操作数都将转换为无符号整数类型 对应于带有符号整数类型的操作数的类型。
在你的情况下应用规则3,因为printf期望unsigned int并且你给了signed char。