2014-10-05 98 views
0

我必须为2个表示之间的转换写一个例程。 但我有点困惑。 如果我有与32个比特 ,我必须字0xA15D23B1 存储与大端字的存储器的体系结构23之后,并在端B1 与小端成为A1 5D之后的存储器,而该存储器是B1 23日后5D后A1 是不是?Little-endian和Big-endian

如果我可以解决我机器上的单个字节和我的单词的地址为零 谁是字节1? 在Big-endian中是5D?在小端也是5D?

谢谢大家谁都会回答我

+0

不,这是不对的,你已经倒退了。在小端中,最低有效字节具有最低地址。 – 2014-10-05 15:54:07

+0

你的第一段是正确的,除了不正确地使用“after”这个词使它有点混乱(我认为你的意思是“后面”而不是“之后”)。我不明白你在第二段中提出的问题。 – interjay 2014-10-05 15:55:58

+0

你已经回答了你的问题。 “5天后和23天后B1”。你能描述一下你的实际编程问题吗?地址零通常不可用于程序。你可以使用像hton这样的函数来避免完全处理endian问题。 – 2014-10-05 15:56:43

回答

5

大端内存布局是最显著第一字节,而little-endian的布局是第一至少显著字节。给定的值0xA15D23B1:

Memory address 0 1 2 3 
Big-endian  A1 5D 23 B1 
Little-endian B1 23 5D A1 

注意大端内存布局不相对于字大小改变,但小端一样。如果考虑两个简单的字(16位),0xA15D和0x23B1连续存储:

Memory address 0 1 2 3 
Big-endian  A1 5D 23 B1 
Little-endian 5D A1 B1 23 
0
  • 和little-endian的是5D吗?

号在小尾数是23

0

记“这是”一个好办法:

大端从大(最显著)结束时开始;小端从小端开始。

例如,对于单词0xA15D23B1作为一个字节序列时,大端机器从最显著字节0xA1启动它。它将被存储在最低地址(这是潜在的混淆词“开始”的含义)。顺便说一句,如果你只想从big-endian转换成little-endian或back,你不必理解这一点:只需要颠倒字节顺序!这就是为什么很多人不理解what "big-endian" or "little-endian" means - 你通常只需要了解是否要交换字节。

0

处理器有多种方式实现big-endian和little-endian - 有关详细的讨论,请参阅有关Endianness的Wikipedia文章。

对于2字节数量,仅存在两个选项:

Value:   0x1234 (MSB = 0x12, LSB = 0x34) 
Little-endian: LSB then MSB 0x34 0x12 — Intel, … 
Big-endian:  MSB then LSB 0x12 0x34 — SPARC, PowerPC, … 

对于4字节数量,有更多的选项,但仍有两个伯酮(加上一个历史好奇心):

Value:   0x12345678 (MSB = 0x12, NMSB = 0x34, NLSB = 0x56, LSB = 0x78) 
Little-endian: LSB, NLSB, NMSB, MSB 0x78 0x56 0x34 0x12 
Big-endian:  MSB, NMSB, NLSB, LSB 0x12 0x34 0x56 0x78 
PDP-11:   NMSB, MSB, NLSB, LSB 0x34 0x12 0x78 0x56 

注意,许多现代化的芯片组是双端 - 可以切换到大端或小端模式下运行:

某些体系结构(包括ARM版本3及以上版本,PowerPC,Alpha,SPARC V9,MIPS,PA-RISC,SuperH SH-4和IA-64)具有允许在数据段,代码段或二者中可切换字节序的设置。