我知道,当将
%x
与 printf()
一起使用时,我们将从堆栈中打印 4 个字节(十六进制的 int
)。但我只想打印 1 个字节。有办法做到这一点吗?
假设:你想打印一个1字节宽度的变量的值,即
char
。
如果您有一个
char
变量(例如 char x = 0;
)并且想要打印该值,请使用 %hhx
格式说明符和 printf()
。
类似的东西
printf("%hhx", x);
否则,由于默认参数提升,类似的语句
printf("%x", x);
也是正确的,因为
printf()
不会从stack读取
sizeof(unsigned int)
,x
的值将根据它的类型读取,并且无论如何它都会被提升为所需的类型。
您需要小心执行此操作以避免任何未定义的行为。
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
)。
您可以使用以下解决方案来打印一个字节:
printf
:
unsigned char c = 255;
printf("Unsigned char: %hhu\n", c);
如果您想打印较大值类型中存在的单个字节,您可以屏蔽和/或移出所需的值。例如:
int x = 0x12345678;
x & 0x00FF0000 >> 16
另一种选择是通过使用(无符号)字符指针和偏移量转换所需的字节位置来检索所需的字节。