小端序和大端序?

39

我对这两个概念感到困惑。我明白如何使用大端表示法来表示某些内容。

例如,-12 的大端表示是 1111 1111 1111 0100。

但是为什么小端表示法是 1111 0100 1111 1111 而不是 0100 1111 1111 1111?


2
我会为新手们提供这个链接:https://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/ - Erti-Chris Eelmaa
2个回答

28

小端字节序是指对于多字节值,将其字节顺序颠倒。

1111 1111 1111 0100是一个2字节的值,其中1111 1111是第一个字节,1111 0100是第二个字节。在小端字节序中,先读取第二个字节(或最低有效字节),因此最终的表示为1111 0100 1111 1111


27

字节序(Endianness)是关于字节地址顺序的问题。小端模式表示低位字节在低地址,大端模式则相反。因此,它是关于字节(8位块)而不是半字节(4位块)的。我们使用的大多数计算机(有少数例外)在单个地址级别上寻址字节。

-12为例:

在内存中,小端模式的表示为:

000000: F4
000001: FF

大端序,在内存中,将是:

000000: FF
000001: F4

它在堆栈上的行为如何?如果堆栈向下增长,会影响其行为吗? - Krrish Raj
@KrrishRaj 不,如果您遵循大小端定义中地址顺序的“规则”,那么它是一个堆栈并不相关。堆栈不会改变我在答案中所指示的内容。堆栈通常向“下”增长(当您将值推入堆栈时,它会进入下一个较低的地址)。因此,例如,当您将字节推入堆栈时,它们具有较低的地址。例如,如果您想将FF F4(16位整数中的-12)推入堆栈,并且它是小端,则应首先推入FF,然后是F4,因为这会将FF放在较高的地址上。 - lurker
在互联网上,Intel 被认为是小端字节序。当我使用 gdb 检查堆栈时,它被组织成 4 字节一组的形式,如 44 43 42 41、48 47 46 45 等(而块的地址显示为 41、45,即组中最低的地址)。当我推送一个字符串 "abcd" 时,我得到的值是 6463261。在这里我感到困惑,如果它是小端机器,那么我应该只得到 61626364。我错在哪里了? - Krrish Raj
@KrrishRaj 你是怎么“推一个字符串”的?这取决于你使用了什么指令。字符串没有“字节序”。数字有。 - lurker
我正在使用一个简单的C程序,使用gets获取输入并将其存储在char数组中。 - Krrish Raj
在C语言中,字符串是字符数组。数组存储时,第一个元素存储在最低地址,后面的元素依次存储在相邻地址中。如果您使用的是8位字符,则字符串"abcd"将以'a'存储在第一个地址,然后是'b'在下一个地址,以此类推。这就是所看到的。字节序不适用于单字节值。 - lurker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接