考虑一个系统,它有一个字节可寻址存储器,根据大端方案组织成 32 位字。程序读取在键盘上输入的 ASCII 字符并将它们存储在从位置 1000 开始的连续字节位置中。
在输入名称 johnson 之后,显示位置 1000 和 1004 处的两个记忆字的内容。用 little-endian 方案写这个。
我得到的是:
[NULL, n], [o, s], [n,h], [o,j] 00, 6E 6F, 73 6E, 68 6F, 6A
我只想知道这是否正确,如果不正确,我做错了什么。
谢谢你们!
考虑一个系统,它有一个字节可寻址存储器,根据大端方案组织成 32 位字。程序读取在键盘上输入的 ASCII 字符并将它们存储在从位置 1000 开始的连续字节位置中。
在输入名称 johnson 之后,显示位置 1000 和 1004 处的两个记忆字的内容。用 little-endian 方案写这个。
我得到的是:
[NULL, n], [o, s], [n,h], [o,j] 00, 6E 6F, 73 6E, 68 6F, 6A
我只想知道这是否正确,如果不正确,我做错了什么。
谢谢你们!
没有用于存储单个字节(例如 ASCII 字符)的字节序之类的东西。Endianes 仅在将值表示为多个字节时才起作用。因此,例如,在 little-endian 和 big-endian 中存储字节序列是相同的,只是字节的表示不同。例如,取数字 3 735 928 559(或十六进制表示法中的 0xdeadbeef)并将其作为 32 位字(例如,一个 int)存储在内存位置 1000 将给出:
ADR: 1000 1001 1002 1004  
BE:   de   ad   be   ef  
LE:   ef   be   ad   de  
因此,如果您要将 ASCII 字符实际表示为 32 位字,您将得到:
[0, 0, 0, 6a], [0, 0, 0, 6f], ... or,  
[6a, 0, 0, 0], [6f, 0, 0, 0], ...
分别为 BE 和 LE。
我觉得这个问题很混乱。
byte通常被定义为最小的可寻址单元,因此说机器具有字节可寻址内存只是什么都没有说明:每台机器都有字节可寻址内存,因为这是字节的定义,可以改变的是一个字节有多少位。
如果问题是关于 32 位字节机器(我知道它们存在,但我个人只使用具有 8 位和 16 位字节的机器),那么鉴于没有多字节处理,不清楚扮演字节序的角色是什么存储 ASCII 是必需的。然而,在大字节机器中经常做的是每个字节存储多个字符以节省空间(不一定是 16 位字节机器是“大”的:我知道的是一个内存非常有限的 DSP)但是这个似乎与问题无关,无论如何都有“标准”的方法。
相反,如果问题假设一个字节根据定义始终是 8 位,并且谈论存储 ASCII 字符,那么字节序再次不起作用;字符只是在连续的位置一个接一个地存储在内存中。例如,如果字符串"johnson"已被存储(假设 C 字符串约定),则内存内容将是:
0x6A 0x6F 0x68 0x6E 0x73 0x6F 0x6E 0x00
将内存内容读取为两个 32 位字当然会受到字节序的影响,但是说机器使用大字节序并要求以小字节序显示结果是无稽之谈。
在大端模式(例如 68k)中,两个 32 位字将是0x6A6F686Eand 0x736F6E00,在小端模式(例如 x86)中,它们将是0x6E686F6Aand 0x006E6F73。