Little endian与Big endian

Tom*_*ski 8 c pointers casting endianness

让我说我有4Byte整数,我想把它转换为2Byte短整数.我是对的,在(小和大端)短整数将包含这个4Byte整数的2个最低有效字节?

第二个问题:
小端和大端处理器中这些代码的结果是什么?

int i = some_number;  
short s = *(short*)&i;
Run Code Online (Sandbox Code Playgroud)

在大端处理器2中的恕我直言,将复制最重要的字节,在小端,将复制2个最低有效字节.

Joh*_*ler 12

我是对的,在两个短整数中都包含这个4Byte整数的2个最低有效字节吗?

是的,根据定义.

bigE和littleE之间的区别在于最低有效字节是否位于最低地址.在小端处理器上,最低地址是最低有效位,x86就是这样做的.

这些在小E上得到相同的结果.

short s = (short)i;
short s = *(short*)&i;
Run Code Online (Sandbox Code Playgroud)

在大端处理器上,最高地址是最低有效位,68000和Power PC这样做(实际上Power PC可以是两者,但Apple的PPC机器使用bigE)

这些给出了大E的相同结果.

short s = (short)i;
short s = ((short*)&i)[1]; // (assuming i is 4 byte int)
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的,little endian允许您获取操作数的最低有效位,而无需知道它有多大.little E具有保持向后兼容性的优点.

那么big endian有什么优势呢?它创建更容易阅读的十六进制转储.

实际上,摩托罗拉的工程师认为减轻读取十六进制转储的负担比向后兼容性更重要.英特尔的工程师相反.

  • Big E和Little E的决定与向后兼容性没什么关系.在所有处理器中保持与先前版本相同的Endianess有助于促进代码重用.原始处理器上Big E与Little E的选择更多地与人类可读性(Big E)和简化电路(Little E)有关.英特尔选择了Little E,摩托罗拉选择了Big E.很多当前的处理器都可以随时切换. (2认同)
  • @Lazer:我说的原因.在BigE上,除非知道地址_和size_,否则无法加载值的低16位.在LittleE上你只需要知道地址.BigE对我们来说似乎更"自然",因为我们为数字的最左边数字赋予了更多的意义.它们向左增长,而其他数据向右增长.BigE迎合了一点点非理性,并且要付出复杂的代价.LittleE反而以牺牲人类为代价来满足硬件的需求.如果它不比BigE好,那就不存在了 (2认同)