Binary Little Endian-内存内容/地址

Binary Little Endian-内存内容/地址,binary,Binary,考虑一个系统,它有一个按照big-endian方案以32位字组织的字节可寻址内存。程序读取在键盘上输入的ASCII字符,并将其存储在从位置1000开始的连续字节位置 输入名称后,在位置1000和1004处显示两个记忆字的内容。用little endian方案写下这个 我得到的是: [NULL,n],[o,s],[n,h],[o,j] 00、6E 6F、73 6E、68 6F、6A 我只想知道这是否正确,如果不正确,我做错了什么 谢谢大家! 没有存储单个字节(如ASCII字符)的endianes。

考虑一个系统,它有一个按照big-endian方案以32位字组织的字节可寻址内存。程序读取在键盘上输入的ASCII字符,并将其存储在从位置1000开始的连续字节位置

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

我得到的是:

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

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


谢谢大家!

没有存储单个字节(如ASCII字符)的endianes。只有当值表示为多个字节时,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。

没有用于存储单个字节(如ASCII字符)的endianes。只有当值表示为多个字节时,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不需要多字节处理,因此不清楚endian的作用是什么。 然而,在大字节机器中经常做的是每字节存储多个字符以节省空间(不一定16位字节机器是“大的”:我所知道的是一个内存非常有限的DSP),但这似乎与问题无关,无论如何都有这样的“标准”方法

相反,如果问题假设一个字节的定义总是8位的,并且谈论存储ASCII字符,那么endian ness再次不起作用;字符只是以连续的位置一个接一个地存储在内存中。例如,如果已存储字符串
“johnson”
(假设采用C字符串约定),则内存内容将为:

0x6A 0x6F 0x68 0x6E 0x73 0x6F 0x6E 0x00
当然,将此内存内容作为两个32位字来读取会受到endian的影响,但是说机器使用big endian并要求以little endian方案显示结果是毫无意义的


在大端模式(例如68k)中,两个32位字将是
0x6F686E
0x736F6E00
,在小端模式(例如x86)中,它们将是
0x6E686F6A
0x006E6F73
,我发现这个问题相当混乱

byte
通常被定义为最小的可寻址单元,所以说机器有字节可寻址内存只是说明什么:每台机器都有字节可寻址内存,因为这是字节的定义,可以改变的是一个字节有多少位

如果问题是关于32位字节的机器(我知道它们存在,但我个人只使用8位和16位字节的机器),那么鉴于存储ASCII不需要多字节处理,因此不清楚endian的作用是什么。 然而,在大字节机器中经常做的是每字节存储多个字符以节省空间(不一定16位字节机器是“大的”:我所知道的是一个内存非常有限的DSP),但这似乎与问题无关,无论如何都有这样的“标准”方法

相反,如果问题假设一个字节的定义总是8位的,并且谈论存储ASCII字符,那么endian ness再次不起作用;字符只是以连续的位置一个接一个地存储在内存中。例如,如果已存储字符串
“johnson”
(假设采用C字符串约定),则内存内容将为:

0x6A 0x6F 0x68 0x6E 0x73 0x6F 0x6E 0x00
当然,将此内存内容作为两个32位字来读取会受到endian的影响,但是说机器使用big endian并要求以little endian方案显示结果是毫无意义的


在大端模式(例如68k)中,两个32位字将是
0x6F686E
0x736F6E00
,在小端模式(例如x86)中,它们将是
0x6E686F6A
0x006E6F73

伊格纳西奥·瓦斯奎兹·艾布拉姆斯的答案是正确的,但只是对您的初步答案的一点评论:如果您的机器有32位字,您应该将4个字符“打包”成一个单词,而不是两个,就像您使用符号所做的那样。正确答案应该是[6a,6f,68,6e],[73,6f,6e,00]。这看起来可能是一个诡计问题,因为我认为很多人可能会在问题中看到“little endian”时颠倒两个单词的字节顺序。嘿,Ray!非常感谢您的评论。我很困惑,因为我看到Endian有最重要的字节和最少的字节地址,反之亦然。这是否意味着两个小端/大端的答案是相同的?对于big-endian,我得到了:character:jo h n s o n[null