1. 高低字节

1一个16位(双字节)的数据,比如0xFF1A(16进制)

那么高位字节就是FF,低位就是1A




2. 如果是32位的数据如,0x3F68415B

高位(不是字节)3F68

低位(不是字节)415B

左边是高位,右边是低位




3. c语言中的高位字节和低位字节

如果用内存中的两个字节表示一个16位的数,

0000 0000 0000 0001  最后一个他表示的范围   1

0000 0000 0000 0010  倒数第二个他表示的范围 2*1

0000 0000 0000 0100  倒数第三个他表示的范围 2*2*1

以此类推


那么其中一个字节存放最低的8位有效位,另一个存放最高的8位有效位,


存放最低的8位有效位的字节被称为:最低有效位字节或低位字节

存放最高的8位有效位的字节被称为:最高有效位字节或高位字节



      高位字节                 低位字节

↓--------------------------↓ ↓---------------------------↓           
 
15  14  13  12  11  10  9.  8.  7.  6.  5.  4.  3.  2.  1.  0. 






4. 栈的生长方向

从图中看 a的地址是大于b的地址

IK%KR[%HN{EG(7)PUWM3CHW.png






5. 大端法和小端法

小端法: (Little-Endian) 高高  低低

低位字节放在内存低地址 即为该值起始地址, 高位字节排放在内存的高位地址端。



大端法: (Big-Endian)  高低  低高

高位字节放在内存的低地址端即该值的其实地址, 低位字节排放在内存的高地址端。




0x12345678 在栈中

int a = 0x12345678;

printf("%x\n", *((char*)&a + 0));//78   低位 字节        低地址

printf("%x\n", *((char*)&a + 1));//56   

printf("%x\n", *((char*)&a + 2));//34

printf("%x\n", *((char*)&a + 3));//12   高位 字节       高地址

X$62_KOX9VYC{~Z]4}H}[QW.png

所以他默认使用的是小端法,低位字节 放低地址作为起始点.





小端法表示图 

YB{Q(OR06E1U~AN~(~ZJ]0J.png






大端法表示图 

4R81F9_LO5I_XBE(%S4(MOG.png







6. 网络字节序

网络上的数据流是字节流,对于一个多字节的数值,在进行网络传输的时候,应该先传哪个字节,

当接收端收到第一个字节时候,他是将这个字节作为高位还是低位呢?

网络字节序的定义:收到的第一个字节被当做高位看待,这就要求发送端发送的第一个

字节就是高位, 而在发送端发送数据的时候,发送的第一个字节是该数字在内存

的其实地址对应的字节,  那这样的话,首先要发送高位,起始地址放高位的就是:大端法。

网络字节序说的就是   大端法字节序

如0x12345678这个×××,在X86平台下,他默认就是小端法存放的,在发送前

需要使用API将他转换成大端法存放,


int a = 0x12345678;
printf("%x\n", *((char*)&a+0));   78
printf("%x\n", *((char*)&a + 1));  56
printf("%x\n", *((char*)&a + 2));  34
printf("%x\n", *((char*)&a + 3));  12

//转换成网络字节序
a = htonl(a);

printf("%x\n", *((char*)&a + 0)); 12
printf("%x\n", *((char*)&a + 1)); 34
printf("%x\n", *((char*)&a + 2)); 56
printf("%x\n", *((char*)&a + 3)); 78