根据big-endian方案,考虑具有以32位字组织的字节可寻址存储器的系统。程序读取在键盘输入的ASCII字符,并将它们存储在从位置1000开始的连续字节位置。
在输入名称johnson后,显示位置1000和1004处的两个记忆单词的内容。用little-endian方案写这个。
我得到的是:
[NULL,n],[o,s],[n,h],[o,j] 00,6E 6F,73 6E,68 6F,6A
我只是想知道这是否正确,如果没有,我做错了什么。
谢谢大家!
答案 0 :(得分:1)
没有用于存储单个字节(例如ASCII字符)的endianes。当一个值表示为多个字节时,Endianes才会起作用。因此,例如,存储字节序列在小端和大端中是相同的,只有字节的表示是不同的。例如,取3 335 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 。
答案 1 :(得分:0)
我觉得这个问题很混乱。
byte
通常被定义为最小的可寻址单元,因此说机器具有字节可寻址的内存只是告诉任何事情:每台机器都有字节可寻址的内存,因为这是字节的定义,可以改变什么是一个字节有多少位。
如果问题在于讨论32位字节机器(我知道它们存在,但我个人只使用8位和16位字节的机器)那么不清楚什么角色正在播放endian-ness给出存储ASCII不需要多字节处理。 然而,在大字节机器中经常做的是每个字节存储多个字符以节省空间(不一定是16位字节机器是“大”的:我知道的是具有非常有限的存储器的DSP)但是这个似乎与这个问题无关,无论如何都有这样“标准”的方式。
如果相反,问题假定一个字节总是按位定义为8位,并且讨论存储ASCII字符,那么endian-ness不再起作用;字符只是在连续的位置一个接一个地存储在内存中。例如,如果已存储字符串"johnson"
(假设采用C字符串约定),则内存的内容将为:
0x6A 0x6F 0x68 0x6E 0x73 0x6F 0x6E 0x00
将这个内存内容读取为两个32位字当然会受到字节序的影响,但是说机器使用big-endian并要求以little-endian方案显示结果是无稽之谈。
在大端方案(例如68k)中,两个32位字将是0x6A6F686E
和0x736F6E00
,在小端方案(例如x86)中它们将是0x6E686F6A
和0x006E6F73
。