使用 2 字节int
s,这就是你的记忆
memAddr | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
data | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | '\0' |
^ s points here
^ p+1 points here
现在,看起来您正在使用 ASCII 编码,所以这就是您的really记忆中有
memAddr | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
data | 0x41 | 0x42 | 0x43 | 0x44 | 0x45 | 0x46 | 0x00 |
^ s points here
^ p+1 points here
所以对于小端机器来说,这意味着最低有效字节对于多字节类型先来吧。单字节没有字节顺序的概念char
。 ASCII 字符串只是一个字符串char
是..这没有字节顺序。你的int
s 是 2 个字节。所以对于一个int
从内存位置 2 开始,该字节是最低有效字节,地址 3 处的字节是最高有效字节。这意味着这里的数字,以人们通常读取数字的方式读取,是 0x4443(基数为 10 的 17475,“DC”作为 ASCII 字符串),因为内存位置 3 中的 0x44 比内存位置 2 中的 0x43 更重要。对于大端序当然,这会颠倒过来,数字将是 0x4344(基数为 10 的 17220,“CD”作为 ASCII 字符串)。
EDIT:
处理您的评论... Ac
字符串是一个NUL
终止数组char
s,这是绝对正确的。 Endianess 仅适用于原始类型,short, int, long, long long
等等(“原始类型”可能是不正确的命名法,知道的人可以纠正我)。数组只是连续内存的一部分,其中 1 个或多个类型直接相邻出现并存储依次地。整个数组没有字节序的概念,但是,字节序does适用于数组各个元素的基本类型。假设您有以下内容,假设 2 字节int
s:
int array[3]; // with 2 byte ints, this occupies 6 contiguous bytes in memory
array[0] = 0x1234;
array[1] = 0x5678;
array[2] = 0x9abc;
这就是内存的样子:无论对于大端还是小端机器,它都会看起来像这样
memAddr | 0-1 | 2-3 | 4-5 |
data | array[0] | array[1] | array[2] |
请注意,数组没有字节顺序的概念elements。无论元素是什么,这都是事实。元素可以是原始类型,structs
,, 任何事物。数组中的第一个元素始终位于array[0]
.
但现在,如果我们查看数组中的实际内容,就会发现字节序确实发挥作用。对于小端机器,内存将如下所示:
memAddr | 0 | 1 | 2 | 3 | 4 | 5 |
data | 0x34 | 0x12 | 0x78 | 0x56 | 0xbc | 0x9a |
^______^ ^______^ ^______^
array[0] array[1] array[2]
最低有效字节在前。大端机器看起来像这样:
memAddr | 0 | 1 | 2 | 3 | 4 | 5 |
data | 0x12 | 0x34 | 0x56 | 0x78 | 0x9a | 0xbc |
^______^ ^______^ ^______^
array[0] array[1] array[2]
注意contents数组的每个元素都受字节顺序的影响(因为它是一个基本类型的数组..如果它是一个数组structs
, the struct
成员不会受到某种字节序反转的影响,字节序仅适用于原语)。然而,无论是在大端机还是小端机上,数组元素的顺序仍然相同。
回到你的字符串,字符串只是一个NUL
终止的字符数组。char
s 是单字节,因此只有一种方法可以对它们进行排序。考虑代码:
char word[] = "hey";
这就是你记忆中的内容:
memAddr | 0 | 1 | 2 | 3 |
data | word[0] | word[1] | word[2] | word[3] |
equals NUL terminator '\0' ^
就在这种情况下,每个元素word
数组是一个字节,并且只有一种方法来订购单个项目,因此无论是在小端还是大端机器上,这就是您在内存中的内容:
memAddr | 0 | 1 | 2 | 3 |
data | 0x68 | 0x65 | 0x79 | 0x00 |
Endianess 仅适用于多字节原始类型。我强烈建议您在调试器中进行探索,以实际操作来查看这一点。所有流行的 IDE 都有内存视图窗口,或者带有gdb
你可以打印出内存 http://www.delorie.com/gnu/docs/gdb/gdb_56.html. In gdb
您可以将内存打印为字节、半字(2 个字节)、单词(4 个字节)、巨型单词(8 个字节)等。在小端机器上,如果您将字符串打印为字节,您将看到其中的字母命令。作为半字打印,您会看到每 2 个字母“反转”,作为单词打印,每 4 个字母“反转”,等等。在大端机器上,它都会以相同的“可读”顺序打印出来。