关于endian的一个问题

时间:2011-02-10 18:42:11

标签: c endianness

程序是决定大端还是小端。

这是书中给出的答案:

int Test(){
    short int word = 0x0001;
    char *byte = (char *) &word;
    return (byte[0] ? BIG:LITTLE);
}

我不理解这一行:char *byte = (char *) &word;这是否意味着“将字地址传递给字节”?那么,现在字节指向word的原始地址?据我所知,short int是2个字节。那么,“byte”指向更高的地址还是更低的地址?为什么呢?

这是如何运作的?

3 个答案:

答案 0 :(得分:3)

它只是取word的地址,将其转换为char指针,然后将其放入byte

此时,byte将指向2字节word的第一个字节,该字节的值(1或0)将告诉您是否在大字节或小端机。

答案 1 :(得分:3)

如果我们假设short是2个字节,那么内存布局在大端机器上看起来像这样:

MSB        LSB
-------------------
|  0x0   |   0x1  |
-------------------

在小端机器上就像这样

MSB        LSB
-------------------
|  0x1   |   0x0  |
-------------------

即,短0x0001由2个字节组成,一个值为0,另一个值为1.在大端机器上,最小值的字节(此处为0x1)存储在该值的较低内存地址中简而言之,最重要的字节存储在较高的地址中。在一台小端机器上,它是另一种方式。

因此,char *byte = (char *) &word;获取word的地址并将其解释为char *。假设char是8位,我们现在有一个指向short的最低有效字节的指针。如果那是0x1,则机器是大端,如上图所示。如果它是0,那它就是一个小端机器。

(请注意,这种检查endianess的方式可能不是可移植的 - 例如,有一个char与short一样大小的机器,以及许多其他或多或少的深奥的问题,这种方法)

答案 2 :(得分:0)

您希望逐个字节读取单词。 所以你拿一个指向一次一个字节的单词的指针。这是一个char *,因为char是标准定义的1字节。 然后你将char *指向分配了单词的内存位置,并读取第一个值(byte [0],你也可以使用* byte来取消引用它)。 如果它是1,它是一个大端机:

01 00

如果它为零,则它是一个小端机

00 01