【问题标题】:Printing using hexadecimal format specifier使用十六进制格式说明符打印
【发布时间】:2015-12-31 12:12:51
【问题描述】:

为什么给定的代码会给出以下输出。

#include <stdio.h>
int main(void) 
{
    int x = 0x12345678;
    unsigned short *p = &x;
    unsigned char *q = &x;
    printf("%x %x\n",*p++,*p++);
    printf("%x %x %x %x\n",q[0],q[1],q[2],q[3]);
    return 0;
}

输出:

1234 5678
78 56 34 12

而不是:

1234 5678
12 34 56 78

我认为答案可能是架构的字节序必须导致它。但我无法理解如何,因为整个4-byte 必须以连续的方式存储。

也不要*q++*(q+1)指向同一个地址?

【问题讨论】:

  • q++ 具有 q 的值,但在 返回它的值之后递增。 q + 1 的值为q + 1,与q 不同。
  • @πάντα ῥεῖ 为什么将这个 C 问题标记为 C++ 问题的副本?你知道 C 和 C++ 不是同一种语言吗?
  • 更重要的是,链接的问题有一条评论,明确指出不应将其标记为 C,因为 C 对未定义行为有不同的规则。
  • 因为整个 4 字节必须以连续的方式存储”是字节序的定义。
  • @RahulShah 通常,您不能在一个语句中对同一个变量进行两次后增量。这会导致未指定的评估顺序。

标签: c hex printf


【解决方案1】:

*q++*(q + 1) 在表达式中计算它们的值时不指向相同的内存位置。 *q++ 将指向 q 之后的下一个内存位置。

您得到 78 56 34 12 而不是 12 34 56 78 的原因与字节顺序有关;在内存中,您的int 可能存储为78563412。尝试将 printf 语句中的 q[0] 到 q[3] 替换为 x &amp; 0xff, (x &gt;&gt; 8) &amp; 0xff, (x &gt;&gt; 16) &amp; 0xff, (x &gt;&gt; 24) &amp; 0xff,看看是否得到了预期的结果。

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    相关资源
    最近更新 更多