【问题标题】:Concept of big endian and little endian [closed]大端和小端的概念[关闭]
【发布时间】:2018-04-24 16:52:04
【问题描述】:

在 union 中,所有元素都指向同一个内存槽。因此,如果我们将 int 视为 2 个字节,那么它包含二进制值 00000001 00000000(256)。由于char的大小是1字节,所以前半部分(1字节)应该分配00000001,后半部分应该分配00000000。但是为什么下面的代码打印256 0 1而不是256 1 0

    #include<stdio.h>
    int main()
    {

        union a{
               int i;
               char ch[10];
               };

        union a u;
        u.i=256;
        printf("%d,%d,%d",u.i,u.ch[0],u.ch[1]);
        return 0;

    }

【问题讨论】:

  • 这只是意味着你在Little Endian机器上运行它。
  • 因为您使用的是 little-endian 系统(就像所有 x86 系统一样)?
  • 因为u.i 是从联合的任何其他元素读取的活动成员是未定义的行为。一些编译器实现了扩展以允许这样做,您需要检查您是否已启用它们。见:en.cppreference.com/w/cpp/language/union
  • @RichardCritten C 标准允许通过联合进行类型双关(尽管 C++ 不允许),以及使用 char * 访问任何类型。
  • @RichardCritten 这取决于语言。在 C 中,允许使用联合进行类型双关。在 C++ 中,它是 not 允许的。所以应该真正指定真正使用什么语言。

标签: c++ c storage unions


【解决方案1】:

你有一个 little-endian* 机器。

i 的字节以低字节在前。

如果你有一台大端机器,预期的输出不会是“256 1 0”,除非sizeof(int) 是 2。我认为你没有 16 位处理器。在更可能的sizeof(int) 4 中,您将得到“256 0 0”的输出。试试这个程序:

#include<stdio.h>
int main()
{

    union a{
           int i;
           char ch[sizeof(int)];
           };

    union a u;
    u.i=256;
    printf("%d", u.i);
    for (int b = 0; b < sizeof(int); ++b)
        printf(",%d", (int)(unsigned char)(u.ch[b]));
    printf("\n");
    return 0;

}

这将显示u.i 的所有字节,按您的处理器布置它们的顺序。

*假设您不在 PDP 上。您不想了解 PDP。

【讨论】:

  • 很好地参考了优秀的 PDP-11。带我回去。
  • Endianess 使用十六进制可能会更好地可视化。
  • @ThomasMatthews:是的,但 OP 喜欢十进制。
猜你喜欢
  • 1970-01-01
  • 2014-01-11
  • 2017-02-27
  • 1970-01-01
  • 2015-07-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
相关资源
最近更新 更多