我最近在接受采访时被问到:
查看此代码并编写其输出:
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个字节,答案是:
为什么用unsigned short变量只打印16位? 我知道unsigned short是2个字节但是printf知道基于%X的堆栈解析多少字节,%X被读作unsigned int。我会假设它将始终读取4个字节(unsigned int),有时会出现垃圾(或最终损坏的堆栈)。
您怎么看?
谢谢!
答案 0 :(得分:1)
*pS
的类型为unsigned short,因此使用此值。虽然printf期望%X的int,但是你提供了一个unsigned short,它被提升为int。所以顺序是:从数组中读取前2个字节因为* pS是无符号短。然后这个unsigned short值被提升为int。
答案 1 :(得分:0)
输出中没有指针。通过解除引用你告诉printf输出一个短片,这就是它的功能。 %X仅显示为十六进制。