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的地址
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 高位 字节 高地址
所以他默认使用的是小端法,低位字节 放低地址作为起始点.
小端法表示图
大端法表示图
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