首先内存地址和数据的存储大多遵循一个存储规律,
而存储规律分了两类,
一类位大端,数据高位,存储在低地址
也可以是(数据低位,存储在高地址)
数据:0x12345678
高… 低
地址 | 数据 | 高低位置 |
---|---|---|
0x0000 0000 | 0x12 | 低地址 |
0x0000 0001 | 0x34 | |
0x0000 0002 | 0x56 | |
0x0000 0003 | 0x78 | |
0x0000 000… | … | |
0xFFFF FFFF | 0xff | 高地址 |
一类位小端,数据低位,存储在低地址。
(数据高位存储在高地址)
数据:0x12345678
高 … 低
地址 | 数据 | 高低位置 |
---|---|---|
0x0000 0000 | 0x78 | 低地址 |
0x0000 0001 | 0x56 | |
0x0000 0002 | 0x34 | |
0x0000 0003 | 0x12 | |
0x0000 000… | … | |
0xFFFF FFFF | 0xff | 高地址 |
判断数据存储方式通过联合体来判断:
#include <stdio.h>
#icnlude <arpa/inet.h>
int main (void)
{
union
{
short i;
char a[2];
}u;
u.a[0] = 0x12;
u.a[1] = 0x34;
printf ("0x%x\n", u.i); //0x3412 为小端 0x1234 为大端
printf ("0x%.x\n", htons (u.i)); //大小端转换
return 0;
}
方便记忆: