gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:39 24 4
gpt4 key购买 nike

我最近在接受采访并被问到这个问题:


查看这段代码并写下它的输出:

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;

现在假设系统是32bits,unsigned long是4字节,答案是:

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

现在是我的问题:

为什么使用 unsigned short 变量只打印 16 位?我知道 unsigned short 是 2 个字节,但 printf 知道根据 %X 从堆栈中解析多少字节,它被读取为 unsigned int。我假设它会一直读取 4 个字节(unsigned int),有时会有垃圾(或最终损坏的堆栈)。

你怎么看?

谢谢!

最佳答案

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

关于c++ - Printf %X 标识符 - 指针的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21759097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com