大小端

参考链接:https://www.cnblogs.com/wuyuegb2312/archive/2013/06/08/3126510.html

大端 => 高尾端

小端 => 低尾端

计算机系统中,以字节为单位,每个地址单元都对应这一个字节,一个字节为 8bit。

大端:(Big-Endian):就是把数值的高位字节放在内存的低位地址上,把数值的低位字节放在内存的高位地址上。

小端:(Little-Endian):就是把数值的高位字节放在高位的地址上,低位字节放在低位地址上。

1
2
3
4
5
6
#include <stdio.h>
int main() {
int i = 0x12345678;
printf("内存地址:%p\n", &i);
return 0;
}

输出:0x7fff86f78684

【注】不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址。

大小端比较

  1. 小端规则

    地址 0x7fff86f78684 0x7fff86f78685 0x7fff86f78686 0x7fff86f78687
    数值 0x78 0x56 0x34 0x12
  2. 大端规则

    地址 0x7fff86f78684 0x7fff86f78685 0x7fff86f78686 0x7fff86f78687
    数值 0x12 0x34 0x56 0x78

通过上面的表格,可以看出来大小端的不同。(注:其实在计算机内存中并不存在所谓的数据类型,比如 char,int 等的。这个类型在代码中的作用就是让编译器知道每次应该从那个地址起始读取多少位的数据,赋值给相应的变量。)

PHP 源码部分宏函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifdef WORDS_BIGENDIAN
# define ZEND_ENDIAN_LOHI(lo, hi) hi; lo;
# define ZEND_ENDIAN_LOHI_3(lo, mi, hi) hi; mi; lo;
# define ZEND_ENDIAN_LOHI_4(a, b, c, d) d; c; b; a;
# define ZEND_ENDIAN_LOHI_C(lo, hi) hi, lo
# define ZEND_ENDIAN_LOHI_C_3(lo, mi, hi) hi, mi, lo,
# define ZEND_ENDIAN_LOHI_C_4(a, b, c, d) d, c, b, a
#else
# define ZEND_ENDIAN_LOHI(lo, hi) lo; hi;
# define ZEND_ENDIAN_LOHI_3(lo, mi, hi) lo; mi; hi;
# define ZEND_ENDIAN_LOHI_4(a, b, c, d) a; b; c; d;
# define ZEND_ENDIAN_LOHI_C(lo, hi) lo, hi
# define ZEND_ENDIAN_LOHI_C_3(lo, mi, hi) lo, mi, hi,
# define ZEND_ENDIAN_LOHI_C_4(a, b, c, d) a, b, c, d
#endif

# define ZEND_ENDIAN_LOHI_4(a, b, c, d) d; c; b; a;为例,这里涉及到一个大小端的问题: