程序是决定大端还是小端。
这是书中给出的答案:
int Test(){
short int word = 0x0001;
char *byte = (char *) &word;
return (byte[0] ? BIG:LITTLE);
}
我不理解这一行:char *byte = (char *) &word;
这是否意味着“将字地址传递给字节”?那么,现在字节指向word的原始地址?据我所知,short int是2个字节。那么,“byte”指向更高的地址还是更低的地址?为什么呢?
这是如何运作的?
答案 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