你好,我在小端和大端有一个小问题,我知道这个问题已经问过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 ?
那么这些小端和大端有什么用呢?
在我的面试中,我被要求实现可移植到所有大小系统的代码。我回复说:
编译器会自行执行,如果 int i=10 在小端字节序中,那么在大端字节序中它也是 10 作为输出
这个答案正确吗?
00000000 | 00000000 | 00000000 | 00001010 // big endian
00001010 | 00000000 | 00000000 | 00000000 // little endian
数据是否以大端模式或小端模式存储通常仅在您尝试访问内存中变量的较小部分(通常通过指针)时才重要,例如尝试通过指针访问 32 位整数的最低有效字符。指向字符的指针或与字符数组的联合。问题的另一个示例是,如果您将文件中的数据直接读取到 32 位整数数组中,或者从 32 位整数数组中写入数据。文件中的数据通常也会以小端或大端模式存储。
据我所知,没有通用的编译时方法来确定CPU是在大端模式还是小端模式下运行(特定编译器可能对此有定义)。您可以使用 32 位整数的联合和大小为 4 的字符数组编写测试代码。然后将联合中的整数设置为 10,并检查联合字符数组 [0] 是否包含 10,这意味着小端模式,或者如果联合字符数组[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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)