如何用printf打印1个字节?

问题描述 投票:0回答:4

我知道,当将

%x
printf()
一起使用时,我们将从堆栈中打印 4 个字节(十六进制的
int
)。但我只想打印 1 个字节。有办法做到这一点吗?

c printf format-specifiers
4个回答
25
投票

假设:你想打印一个1字节宽度的变量的值,即

char

如果您有一个

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

类似的东西

 printf("%hhx", x);

否则,由于默认参数提升,类似的语句

  printf("%x", x);

也是正确的,因为

printf()
不会从
stack
读取sizeof(unsigned int)
x
的值将根据它的类型读取,并且无论如何它都会被提升为所需的类型。


10
投票

您需要小心执行此操作以避免任何未定义的行为

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
)。


6
投票

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

printf

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

1
投票

如果您想打印较大值类型中存在的单个字节,您可以屏蔽和/或移出所需的值。例如:

int x = 0x12345678; 
x & 0x00FF0000 >> 16

另一种选择是通过使用(无符号)字符指针和偏移量转换所需的字节位置来检索所需的字节。

© www.soinside.com 2019 - 2024. All rights reserved.