我知道当%x
与printf()
一起使用时,我们会从堆栈中打印4个字节(十六进制int
)。但我想只打印1个字节。有没有办法做到这一点?
答案 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)。或者只是通过使用(无符号)字符指针和使用偏移来转换所需的字节位置来检索所需的字节。