如何在Little Endian与Big Endian架构中存储数组值

时间:2014-10-19 21:56:07

标签: c arrays endianness

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

我有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'};

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

我认为Big Endian地址为{01,23,45,FE,DC},其中第一个元素位于内存地址0x100,下一个是0x101,第三个是0x102 ,等等,因为它存储基于MSB的值。但是,我不确定是否应该在表示内存中的数组的值之间有一个指示符,以表明它是一个不同的元素,如null char。比如{01, 23, 45,'\0', FE, DC}

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

2 个答案:

答案 0 :(得分:6)

在little-endian中,字节以最不重要的顺序存储到最重要的位置。 Big-endian恰恰相反。例如,short x=0x1234将以0x340x12存储在little-endian中。

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

  

但是,我不确定是否应该有一个指标   表示内存中数组的值,表明它是不同的   元素,就像一个空字符。

没有这样的指标。

  

{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}

因为long占用8个字节。

答案 1 :(得分:5)

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