您好,我在little endian和big endian中有一个小问题,我知道这个问题已经问过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?
那么这些小端和大端的用途是什么?
在我的采访中,我被要求实现可移植到所有大小系统的代码。我回答说:
这个答案正确吗?
最佳答案
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;