3

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

例如,考虑数字6000=1770h=0001011101110000b。如果一个字节中的位和内存中的字节都是小端的,这将被存储为

00001110 11101000 = 0E E8,

如果字节中的位是大端的,但内存中的字节是小端的,这将被存储为(对于它的价值,这恰好是 Visual Studio 似乎告诉我内存是在 x64 架构中组织的)

01110000 00010111 = 70 17,

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

11101000 00001110 = 0E E8,

最后,如果位是大端,但字节是小端,这将被存储为

00010111 01110000 = 17 70

(希望我做对了。)

那么,“小端”和“大端”这两个术语究竟指的是什么?这些术语是指字节中位的顺序,还是内存中字节的顺序,或两者兼而有之?此外,如果 VS 告诉我,例如,7C“在”给定的特定字节中,它们是否意味着在计算机内存中构成该字节的位是字面意思0111 1100,或者它们只是意味着存储在该字节中的值是7Ch=124,但实际上可能不表示为7c=01111100取决于底层架构是否恰好是小端序?

4

2 回答 2

4

字节中位的顺序是不可见的。由于您无法解决单个位,因此两种情况之间没有区别。但是,您可以寻址单个字节,因此它确实有所作为。

如果我们在字节可寻址内存中表示 6000,则高字节是十进制的 23(6000 除以 256),低字节是十进制的 112(6000 mod 256)。我们可以将其存储为 23,112 或 112,23。没有其他选择。只有字节的顺序是一个开放的选择,这就是字节序的含义。

于 2013-08-19T02:52:54.683 回答
3

在内存中,little-endian 或 big-endian 与其说是从左到右或从右到左的问题,不如说是寻址问题。在 little endian 中,数据的最不重要部分存储在较低地址的位置,而 big endian 则相反。

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

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

在 C 中有位字段,例如

union u {
  unsigned char uc;
  struct s {
    int a :1;
    int b :7;
  };
};

由于位字节序,此代码不可移植。u.uc = 7 可能导致 usb 也为 7 或其他值。 通常字节字节序和位字节序是相同的。但是编译器控制着上面的例子。

位字节序在串行通信中也很重要。由于 1 位是按顺序发送/接收的,因此它与内存的构造需要字节序定义。

结论:
大端和小端最常指“字节”级寻址。位的字节序通常要么相同,要么对程序员具有选择重要性。


顺便说一句,您的示例“如果一个字节中的位和内存中的字节都是小端的,那么这将存储为

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)
于 2013-09-07T14:14:24.377 回答