Computer science 为什么即使是大端计算机也能从较低的内存读取到较高的内存?对于大端性,反向可能更为理想

Computer science 为什么即使是大端计算机也能从较低的内存读取到较高的内存?对于大端性,反向可能更为理想,computer-science,cpu-architecture,Computer Science,Cpu Architecture,我在中阅读了有关endianness的内容,并试图搜索我的问题,发现解释endianness的帖子不会影响C的结构成员在内存中的顺序(从低到高) 同样在wiki中: little-endian系统具有相同值可以为的特性 以不同的长度读取内存,而不使用不同的 地址 但这只有在我们从小到大阅读地址时才能实现 我想知道在哪里(什么体系结构/语言)使用从高到低的内存序列?这将使大端性在这样的网站上有同样的好处,适当地在维基上面引用 另外,例如,在类似于Cmalloc的语言中,它可能意味着返回最大地址,程

我在中阅读了有关endianness的内容,并试图搜索我的问题,发现解释endianness的帖子不会影响
C
的结构成员在内存中的顺序(从低到高)

同样在wiki中:

little-endian系统具有相同值可以为的特性 以不同的长度读取内存,而不使用不同的 地址

但这只有在我们从小到大阅读地址时才能实现

我想知道在哪里(什么体系结构/语言)使用从高到低的内存序列?这将使大端性在这样的网站上有同样的好处,适当地在维基上面引用

另外,例如,在类似于
C
malloc
的语言中,它可能意味着返回最大地址,程序将通过执行
接收地址--
而不是
++
来填充内存(希望我说清楚)


我无法通过网络搜索找到为什么计算机开发没有走上这条路线(从大地址到小地址读取内存)(因为如果wiki中的这句话是正确的,它确实没有走上这条路线)。

据我所知,加法运算比减法运算更容易由CPU完成,因此,从较低的内存到较高的内存,而不是从较低的内存到较高的内存,效率更高/更优

附言。
子结构通常是倒装加加法:

如果我把你的问题理解为“CPU和软件可以从最高地址向下而不是从最低地址向上吗?”,答案是肯定的。它是按照从0开始的人类惯例进行的,但也有例外

例如,在像Unix这样的大多数系统中,程序堆栈从上到下扩展,而在Multics中,程序堆栈是从下到上扩展的。Multics的想法是,如果代码写过数组或结构的末尾,它将注销到空堆栈空间中,而不会覆盖位于较低地址的堆栈值,而在Unix中,位于较高地址的堆栈值将被覆盖,并在返回时崩溃或允许进行安全攻击


对于没有内存映射的较旧系统,从0开始似乎是合理的,因为您无法确定安装了多少内存,以及最高有效内存地址是什么。对于具有内存映射的系统,没有理由改变这种约定。

通常,一个单词的结尾与您访问单词的顺序之间没有任何联系。在一个词中,激励人们选择词尾的推理/好处等根本不适用于数组的索引方式

e、 英特尔发明(或至少使用)了little endian,使8008更像是一个CPU,它希望与位串行ALU和移位寄存器存储兼容。(另请看,显然Datapoint希望Intel构建位串行机器,将跳转目标存储在LSB第一顺序中是为了让他们高兴,即使CPU最终不是位串行的。)

这显然与单独访问单独的单词无关

维基百科引用的“优势”更像是“有趣的事实”,而不是真正有价值的东西。当ISA让其他事情变得更糟或更昂贵,甚至让人类更难处理时,将ISA弯曲变形以获得它是毫无意义的。只有当您正在构建一个CPU,该CPU每次对指令进行一个字节的解码,并且如果解码将是多周期的(因为进位从低位传播到高位),则可以将提取与解码重叠

尽管你本来也可以提出同样的论点,在人们认为big-endian是“自然”的时候,首先构建第一个little-endian CPU


您建议的设计将使单词的地址成为其最低有效字节的地址。(我认为)


这更像是小endian,所有关于内存寻址的内容都被反转/翻转/否定

否则,返回一个指针指向分配结束后的指针只是一种软件约定,这显然不太方便,因为它需要使用偏移量。但是,如果您返回一个指向分配的最后一个字的指针,您如何知道调用者希望将其视为字而不是字节
malloc
返回一个
void*
。如果返回一个指向分配的最后一个字节的指针,则必须进行数学运算才能得到指向最后一个字的指针

因此,除非您反转小尾端,否则返回除指向分配的缓冲区的第一个(或唯一)字节/字/双字/浮点/任何内容的指针以外的任何内容显然更糟糕,特别是考虑到像
malloc
这样的分配器,它不知道调用者将用来访问内存的元素大小


我认为,C的机器型号几乎不能与反向小端系统兼容。您希望
arr[i]
表示
*(arr-i)
而不是
arr+i
,索引寻址模式可能支持
-
而不是
+
。然后,
arr[i]
可以透明地使用返回指向末尾的指针的
malloc
。但是C用
*(x+y)
来定义
x[y]
,有些代码会注意到差异并中断

或者,如果寻址仍然像正常一样工作,您会希望将负索引向上计数到零,以从低地址循环到高地址

如果您的“正常”用例是(i=0;i=-n;i--)的
,那么您的最大索引将变为负值,而您的大小仍然为正值。这似乎更令人困惑

(@Alexei Martianov的回答提出了一个很好的观点:CPU可能需要在地址生成单元和其他普通CPU使用加法器的地方安装一个二进制减法器