为什么char的输出在这种情况下是不同的?

时间:2017-04-25 06:39:53

标签: c arrays hex printf

请帮助我理解该程序的输出:

int main()
{
    char a = 0x99;
    printf("%02x\n", a);
    return 0;
}

输出:

ffffff99

为什么输出会那样?

3 个答案:

答案 0 :(得分:4)

有几个因素在起作用。首先,在您的计算机上,普通char是签名类型,而不是无符号类型。另一方面,像printf()这样的可变函数的参数会经历整数提升规则,因此您的char会转换为int,并且因为它已签名,0x99char 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。