Printf%X标识符 - 指针的奇怪行为

时间:2014-02-13 15:54:49

标签: c++ c printf

我最近在接受采访时被问到:


查看此代码并编写其输出:

unsigned char buff[] = { 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x33 };
unsigned long *pD = (unsigned long *)buff;
unsigned short *pS = (unsigned short *)buff;
void *pEnd = &buff[sizeof(buff) - 1];

for (; pD < pEnd; pD++)
    printf("0x%X\n", *pD);

for (; pS < pEnd; pS++)
    printf("0x%X\n", *pS);

return 0;

现在假设系统为32位且无符号长度为4个字节,答案是:

  • 0x11111111
  • 0x22222222
  • 0x33333333
  • 0x1111
  • 0x1111
  • 0x2222
  • 0x2222
  • 0x3333
  • 0x3333

现在我的问题:

为什么用unsigned short变量只打印16位? 我知道unsigned short是2个字节但是printf知道基于%X的堆栈解析多少字节,%X被读作unsigned int。我会假设它将始终读取4个字节(unsigned int),有时会出现垃圾(或最终损坏的堆栈)。

您怎么看?

谢谢!

2 个答案:

答案 0 :(得分:1)

*pS的类型为unsigned short,因此使用此值。虽然printf期望%X的int,但是你提供了一个unsigned short,它被提升为int。所以顺序是:从数组中读取前2个字节因为* pS是无符号短。然后这个unsigned short值被提升为int。

答案 1 :(得分:0)

输出中没有指针。通过解除引用你告诉printf输出一个短片,这就是它的功能。 %X仅显示为十六进制。