【问题标题】:a question from careercup about endian来自careercup的关于字节序的问题
【发布时间】:2011-02-10 18:42:11
【问题描述】:

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

这是书中给出的答案:

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

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

这是如何工作的?

【问题讨论】:

  • “字节”是指向高地址还是低地址? 这正是 Test 函数应该确定的;在某些机器上更高,在其他机器上更低。

标签: c endianness


【解决方案1】:

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

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

【讨论】:

  • “2 字节字的第一个字节”如您所说,您是指高地址一还是低地址一?
  • 它将指向“低”地址一,在 BIG endian 机器上将是最高有效字节(0),在 LITTLE endian 机器上将是最低有效字节( 1).
【解决方案2】:

如果我们假设 short 是 2 个字节,那么在大端机器上的内存布局如下所示:

最高位 最低位 ------------------ | 0x0 | 0x1 | ------------------

像这样在小端机器上

最高位 最低位 ------------------ | 0x1 | 0x0 | ------------------

也就是说,短的 0x0001 由 2 个字节组成,一个值为 0,另一个值为 1。在大端机器上,最低有效字节(此处为 0x1)存储在其较低的内存地址中简而言之,最高有效字节存储在较高地址中。在小端机器上,情况正好相反。

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

(请注意,这种检查字节顺序的方法可能不便于移植 - 例如,有些机器的 char 与 short 大小相同,以及使用这种方法的许多其他或多或少深奥的陷阱)

【讨论】:

    【解决方案3】:

    您想逐个字节地读取单词。 因此,您需要一个指向 word 的指针,该指针一次将查找一个字节。这是一个 char*,因为按照标准定义,一个 char 是 1 个字节。 然后你将你的 char* 指向分配 word 的内存位置,并读取第一个值(byte[0],你也可以使用 *byte 来取消引用它)。 如果是1,就是大端机:

    01 00
    

    如果为零,则为小端机

    00 01
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-22
      • 2016-03-21
      • 2011-03-15
      • 1970-01-01
      • 2022-12-10
      • 2019-12-09
      • 2019-12-16
      • 1970-01-01
      相关资源
      最近更新 更多