【问题标题】:How are array values stored in Little Endian vs. Big Endian architecture数组值如何存储在 Little Endian 与 Big Endian 架构中
【发布时间】:2014-10-19 21:56:06
【问题描述】:

我正在询问如何判断数组中的一个元素何时完成,而另一个元素何时开始以字节序架构。

我有 2 个数组,long 的大小为 8,char 的大小为 1

long x[2] = {0x012345,0xFEDC};

char c[12] = {'a','b','c','d','e','f','g','h','0','1','2','3'};

我想知道如果我们考虑从内存地址0x100 开始的x 和从内存地址0x200 开始的c,这些值将如何存储在不同的Endian 架构中。

我认为大端地址应该是{01,23,45,FE,DC},其中集合的第一个元素在内存地址0x100,下一个是0x101,第三个是0x102,依此类推,因为它存储了基于 MSB 优先的值。但是,我不确定在表示内存中数组的值之间是否应该有一个指示符来表明它是一个不同的元素,例如'\0'(空字符)。喜欢{01, 23, 45,'\0', FE, DC}

Little Endian Architecture 也是如此,我相信它会将其存储为{45,23,01,DC,FE},但我不确定是否应该有一些指标来突出显示数组中的不同元素

【问题讨论】:

  • 你有一个多头数组。 long 通常是平台的字长,即 4 或 8 个字节。那么为什么两个 long 总共使用 5 个字节的内存,每个只使用有效数字的字节呢?计算机怎么可能以理智的方式访问它?
  • @Sanhadrin:我不认为“理智”是正确的表述方式。在最坏的情况下,它可以简单地集成到编译器中。但是没有原因将空分隔字节或以其他方式指示长度,因为每个元素的大小隐式由其类型表示。
  • @Sanhadrin “long 通常是平台的字长”是一种过度概括——存在许多反例。
  • @Jongware 考虑到它违反了标准,导致访问不对齐,并且需要更多的开销来跟踪相关的索引、插入和删除,这在任何方面都不合理。
  • @Sanhadrin:但那是因为 C 被设计为“接近金属”。如果“金属”有任何不同,那么 5 字节类型可能是有意义的。多年来,数据类型大小从 2 增加到(什么?)10 或 12 字节——in 相同的标准(实际上有很多)。如果会有 5 字节类型,则仍然不需要填充字节,因为它会违反标准的其他部分。

标签: c arrays endianness


【解决方案1】:

在 little-endian 中,字节按从最低有效到最高有效的顺序存储。大端相反。例如,short x=0x1234 将在 little-endian 中存储为 0x34,0x12。

如前所述,它只影响变量的字节顺序,而不影响每个字节内的位顺序。同样,C 数组元素的顺序不受字节序的影响。 array[1] 总是在array[0] 之后开始一个sizeof(*array)。

但是,我不确定是否应该在 表示内存中数组的值,以表明它是不同的 元素,比如一个空字符。

没有这样的指标。

{01,23,45,FE,DC}

{45,23,01,DC,FE}

实际上是

{00,00,00,00,00,01,23,45, 00,00,00,00,00,00,FE,DC}

和

{45,23,01,00,00,00,00,00, DC,FE,00,00,00,00,00,00}

因为longs 占用 8 个字节。

【讨论】:

    【解决方案2】:

    C 中的数组元素是固定大小的。这意味着每个元素恰好占用其类型所需的字节数。在您的示例中,x 由两个 long 类型的元素组成。如果long 在您的计算机上是 4 个字节,那么每个元素占用 4 个字节——不多也不少。

    【讨论】:

    • 这里long的大小是8个字节
    猜你喜欢
    • 2020-12-01
    • 2019-06-30
    • 1970-01-01
    • 2018-05-15
    • 2022-06-10
    • 1970-01-01
    • 2019-03-13
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多