【发布时间】: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