在小端或大端系统中,char数组的排序是否不同

时间:2014-10-20 00:07:46

标签: c endianness

我有一个数组char c[12] = {'a','b','c','d','e','f','g','h','0','1','2','3'} 在十六进制中,这些值将为{0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x30, 0x31, 0x32, 0x33}

我想知道的是,在大端或小端系统中,数组是否会以不同的方式存储在内存中?

我认为它们是相同的,因为endian系统通过确定如何通过数组中单个元素的最小或最重要的位来存储元素并对字节进行排序来工作,但由于char只是一个他们以相同的方式对字节进行排序。

4 个答案:

答案 0 :(得分:12)

想想“大端”和“小端”是什么意思。

内存是一个字节序列(或更有趣的机器,几个序列)。对于大小为两个或更多字节的项目,项目的字节可以按不同的顺序存储在内存中,两个最明显的顺序称为“big endian”和“little endian”(如果你有三个或更多字节) ,那么有两个以上可能的字节顺序,无论如何,谁说例如int的位不能以混乱但固定的顺序分布在多个字节上?)

但是对于字节序列,字节的顺序是字节的顺序。 “big endian”和“little endian”由较大项的位以字节数组排列的方式定义。对于一个字节序列,它们按照它们存储的顺序存储 - 不可能有任何其他顺序。这就像问“数字1,2,3,4是否与数字1,2,3,4有什么不同?”当然他们不能。

答案 1 :(得分:6)

根据定义,char /字节是内存的最小可寻址单位。因此,没有有意义的" endianness"在一个字节内,因为处理器不能在其中索引;它只能读完整件事。一个字节内的各个位是通过数学运算获得的,而不是通过寻址获得的;他们的实际位置与他们的阅读方式无关。字节序仅指具有可索引且物理排序的子组件的多字节对象。

根据定义,数组只有一个顺序的元素,否则索引操作会失败,因此机器关于可能假设占据相同空间的较大类型的字节序的概念也与它无关,因为它们会销毁阵列的访问规则。

答案 2 :(得分:2)

字节必须具有升序的内存地址(如C程序所示),其顺序与您定义的相同。

答案 3 :(得分:1)

char数组在您遇到的任何合理系统上都是相同的。它是具有不同排序的多字节数据类型。过去存在具有奇数字节结尾的系统,但我认为其中任何一个都不再存在。