Memory Endian ness:字节中的位与内存中的字节

Memory Endian ness:字节中的位与内存中的字节,memory,architecture,endianness,Memory,Architecture,Endianness,当我们说一个特定的架构是小端或大端时,我们指的是数字意义是从左到右还是从右到左存储在内存中。我的问题是:这种排序是指字节中的位或顺序,还是内存中的字节顺序 例如,考虑数字 6000=1770H= 00101110111000B < /代码>。如果一个字节中的位和内存中的字节都是小尾数,则将其存储为 11101000 00001110 = 0E E8, 00010111 01110000 = 17 70 00001110 11101000 = 0E E8 00001110 11101000=

当我们说一个特定的架构是小端或大端时,我们指的是数字意义是从左到右还是从右到左存储在内存中。我的问题是:这种排序是指字节中的位或顺序,还是内存中的字节顺序

例如,考虑数字<代码> 6000=1770H= 00101110111000B < /代码>。如果一个字节中的位和内存中的字节都是小尾数,则将其存储为

11101000 00001110 = 0E E8,
00010111 01110000 = 17 70
00001110 11101000 = 0E E8
00001110 11101000=0E E8

如果字节中的位是big-endian,而内存中的字节是little-endian,那么这将被存储为(值得一提的是,Visual Studio似乎正是这样告诉我内存是以x64体系结构组织的)

如果位是小尾数,但字节是大尾数,这将存储为

11101000 00001110 = 0E E8,
00010111 01110000 = 17 70
00001110 11101000 = 0E E8
最后,如果位是big-endian,而字节是little-endian,那么它将存储为

11101000 00001110 = 0E E8,
00010111 01110000 = 17 70
00001110 11101000 = 0E E8
(希望我做得对。)


那么,术语“小端”和“大端”实际上指的是什么?这些术语指的是字节中位的顺序,还是内存中字节的顺序,或者两者都指?此外,如果VS告诉我,例如,
7C
,是“在”给定的特定字节中,它们是否意味着组成计算机内存中该字节的位实际上是
011100
,或者它们只是意味着存储在该字节中的值是
7Ch=124
,但根据底层架构是否恰好是小端字节,or实际上可能不表示为
7c=011111100

字节中的位顺序是不可见的。由于您无法处理单个位,因此这两种情况之间没有区别。但是,您可以对单个字节进行寻址,因此这确实会产生影响


如果我们在字节可寻址内存中表示6000,高字节是23位小数(6000除以256),低字节是112位小数(6000除以256)。我们可以将其存储为23112或112,23。没有其他选择。只有字节的顺序是一个开放的选择,这就是endianness所指的。

在内存中,小endian或大endian与其说是从左到右或从右到左的问题,不如说是寻址问题。在little endian中,数据的最低有效部分存储在较低的寻址位置,与big endian相反

排序在两个级别独立进行。由于大多数机器一次寻址超过1位(回想一下一些有位地址的图形CPU),该地址将定位一组位,通常为8位。因此,如果地址10处的位的有效性低于地址11处的位,则它是一个小端机器。这被概括为字节端点。处理器的特性定义了这一点

如果有办法以某种方式解决这些问题,那么这组位的端点性,即位端点性,是非常重要的。一些处理器提供的操作使用字节(或字)内的位级地址。如果您的编程语言直接允许您使用它或隐藏它,那是另一个问题

在C中,有一些位字段,例如

union u {
  unsigned char uc;
  struct s {
    int a :1;
    int b :7;
  };
};
由于位端点的限制,此代码不可移植。u、 uc=7可能导致u.s.b也为7或其他值。通常,字节结束符和位结束符是相同的。但编译器控制上述示例

位端性在串行通信中也很重要。由于1位是按顺序发送/接收的,它与内存之间的构造需要endian ness定义

总结:
大端和小端最常指的是“字节”级寻址。位的端点通常是相同的,或者对程序员来说具有选择重要性


顺便说一句,你的例子是“如果一个字节中的位和内存中的字节都是小尾端,这将被存储为

11101000 00001110 = 0E E8,
00010111 01110000 = 17 70
00001110 11101000 = 0E E8
我认为这是不正确的,因为左侧和右侧使用不同的尾端。如果您使用相同的尾端,您可能会得出结论

00001110 11101000 = 07 71
为了好玩,考虑一下:

01000000 (big endian) has value "sixty-four" (A big endian word)
10110000 (little endian) has value "thirteen".  (Thirteen is little endian word)