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

时间:2013-08-19 02:23:39

标签: memory architecture endianness

当我们说特定架构是小端或大端时,我们指的是数值有效性是从左到右还是从右到左存储在内存中。我的问题是:这个顺序是指一个字节中的位或顺序,或者如何在内存中排序字节?

例如,考虑数字6000=1770h=0001011101110000b。如果字节中的两个位和内存中的字节都是little-endian,则将其存储为

  

00001110 11101000 = 0E E8,

如果一个字节中的位是big-endian,但是内存中的字节是little-endian,那么它将被存储为(对于它的价值,这恰好是Visual Studio似乎告诉我内存是如何组织的) x64架构)

01110000 00010111 = 70 17,

如果位是little-endian,但字节是big-endian,则将其存储为

11101000 00001110 = 0E E8,

最后,如果位是big-endian,但字节是little-endian,则会将其存储为

00010111 01110000 = 17 70

(希望我做得对。)

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

在内存中,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可能导致u.s.b也是7或其他。 通常字节endian-ness和bit endian-ness是相同的。但是编译器控制着上面的例子。

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

由此得出结论:
Big-endian和little endian通常指的是“字节”级别寻址。该位的字节顺序通常与程序员相同或具有重要性。


BTW,你的例子是“如果一个字节和内存中的字节都是小端,那么它将被存储为

00001110 11101000 = 0E E8

我建议不正确,因为左侧和右侧使用不同的字节序。如果你使用相同的字节序,你可以得出结论

00001110 11101000 = 07 71

fun 考虑:

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