c++ - big endian 和 little endian 值是否可移植?

标签 c++ c memory-management endianness

你好,我在小端和大端有一个小问题,我知道这个问题已经问过 n 次了,但我无法弄清楚以下几点

让 int i=10 在堆栈部分以二进制形式存储为 00000000 00000000 00000000 00001010,如下所示:-

00000000 |00000000 |00000000 |00001010   // In case of little endian
MSB-------------------------------------------LSB

大端

00001010 |00000000 |00000000 |00000000   // In case of in big endian
MSB-------------------------------------------LSB

在这种情况下,小端和大端都会给出相同的输出 10 吗?

那么小端和大端有什么用呢?


在我的面试中,我被要求实现适用于所有大小系统的可移植代码。我回复说:

compiler will do it self like if int i=10 in little endian then in big endian too it is 10 as output

这个答案正确吗?

最佳答案

00000000 | 00000000 | 00000000 | 00001010 // big    endian

00001010 | 00000000 | 00000000 | 00000000 // little endian

数据是以大端模式还是小端模式存储在大多数情况下仅在您尝试访问内存中变量的较小部分时才重要,通常是通过指针,例如尝试访问 32 位的最低有效字符通过指向字符的指针或与字符数组的 union 。问题的另一个示例是,如果您将数据从文件直接读取到 32 位整数数组,或者如果您从 32 位整数数组写入数据。文件中的数据通常也会以小端或大端模式存储。

据我所知,没有通用的编译时方法来确定 cpu 是在大端模式还是小端模式下运行(特定的编译器可能对此有定义)。您可以使用 32 位整数的 union 和大小为 4 的字符数组编写测试代码。然后将 union 中的整数设置为 10,并检查 union 字符数组 [0] 是否包含表示小端模式的 10 , 或者 union 字符数组 [3] 包含 10,这意味着大端模式。确定 CPU 是小端模式还是大端模式的其他方法也是可能的。

一旦确定 cpu 是小端模式还是大端模式,就可以包含条件代码来处理这两种情况,例如 32 位整数数组的文件 I/O。如果您希望文件数据处于大端模式,但您的 CPU 处于小端模式,则必须在写入文件之前或从文件读取之后反转每个整数的字节。

您还可以编写代码序列以大端模式存储数据,而不管 cpu 模式如何。如果已经处于大端模式会浪费时间,但它适用于大端模式和小端模式:

char     buffer[256];
char *   ptr2char;
uint32_t uint32bit;
/* ... */
    ptr2char = buffer;    /* store uint32bit in big endian mode */
    *ptr2char++ = (uint32bit >> 24)&0xff;
    *ptr2char++ = (uint32bit >> 16)&0xff;
    *ptr2char++ = (uint32bit >>  8)&0xff;
    *ptr2char++ = (uint32bit      )&0xff;

关于c++ - big endian 和 little endian 值是否可移植?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27383085/

相关文章:

c++ - MSVC++ 2010 中 C++0x 的 <thread> header 的占位符

c++ - 如何打印一堆具有相同格式的整数?

c - 如何使用 MPI 将链表共享给所有进程

c - 编译C程序时出现 "{\rtf1\ansi"错误

分割为2GB时的linux内存映射:2GB instead of 1GB:3GB

c++ - 类内动态内存分配

c++ - 从 vector 数组调用函数

c++ - 升压精神 X3 : Parsing (some) whitespace into an enum

c - 如何用双指针释放C中的树结构

c++ - "placement new"有什么用?