1

考虑一个系统,它有一个字节可寻址存储器,根据大端方案组织成 32 位字。程序读取在键盘上输入的 ASCII 字符并将它们存储在从位置 1000 开始的连续字节位置中。

在输入名称 johnson 之后,显示位置 1000 和 1004 处的两个记忆字的内容。用 little-endian 方案写这个。

我得到的是:

[NULL, n], [o, s], [n,h], [o,j] 00, 6E 6F, 73 6E, 68 6F, 6A

我只想知道这是否正确,如果不正确,我做错了什么。

谢谢你们!

4

2 回答 2

1

没有用于存储单个字节(例如 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。

于 2013-05-19T05:57:50.630 回答
0

我觉得这个问题很混乱。

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

于 2013-05-19T06:11:32.813 回答