如何用printf打印1个字节?

时间:2017-01-13 15:44:59

标签: c printf format-specifiers

我知道当%xprintf()一起使用时,我们会从堆栈中打印4个字节(十六进制int)。但我想只打印1个字节。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:8)

假设:您想要打印1个字节宽度变量的值,即char

如果您有char变量,char x = 0;并且想要打印该值,请使用%hhx格式说明符和printf()

这样的东西
 printf("%hhx", x);

否则,由于默认参数提升,语句如

  printf("%x", x);

也是正确的,因为printf()无法从堆栈中读取sizeof(unsigned int) x的值将根据其类型和无论如何,它将被提升为所需的类型。

答案 1 :(得分:4)

您需要注意如何避免任何未定义的行为

C标准允许您将int转换为unsigned char,然后使用指针算法打印您想要的字节:

int main()
{
    int foo = 2;
    unsigned char* p = (unsigned char*)&foo;
    printf("%x", p[0]); // outputs the first byte of `foo`
    printf("%x", p[1]); // outputs the second byte of `foo`
}

请注意,在显示输出之前,p[0]p[1]会转换为更宽的类型(int)。

答案 2 :(得分:1)

您可以使用以下解决方案通过printf打印一个字节:

unsigned char c = 255;
printf("Unsigned char: %hhu\n", c);

答案 3 :(得分:0)

如果要打印较大值类型中存在的单个字节,可以屏蔽和/或移出所需的值(例如,int x = 0x12345678; x& 0x00FF0000>> 16)。或者只是通过使用(无符号)字符指针和使用偏移来转换所需的字节位置来检索所需的字节。