概念:
高位、低位:
一般左边为高位 右边为低位
高低地址:
地址大的为高地址,地址小的为低地址。
判断为大端还是小端:
#include <stdio.h>
union {
int i;
char c[sizeof(int)];
} u;
int main()
{
u.i = 0x12345678;
printf("%0x\n",u.c[0]);
return 0;
}
输出:
78
输出0x78:c[0]为低地址,0x78为低位,为小端。反之则为大端
大小端转换:
小转大:在以上代码加入位移,位移多少根据变量类型。
int一共4个字节,最多位移3个字节即24位。
#include <stdio.h>
union {
int i;
char c[sizeof(int)];
} u;
int main()
{
u.i = 0x12345678;
u.i = ((u.i >> 24) & 0x000000FF) |
((u.i >> 8) & 0x0000FF00) |
((u.i << 8) & 0x00FF0000) |
((u.i << 24) & 0xFF000000);
printf("%0x\n",u.c[0]);
return 0;
}
输出:
12
大转小同理:
#include <stdio.h>
union {
int i;
char c[sizeof(int)];
} u;
int main()
{
u.i = 0x12345678;
u.i = ((u.i >> 24) & 0x000000FF) |//0x00000012 & 0x000000FF
((u.i >> 8) & 0x0000FF00) |//0x00123456 & 0x0000FF00
((u.i << 8) & 0x00FF0000) |//0x34567800 & 0x00FF0000
((u.i << 24) & 0xFF000000);//0x78000000 & 0xFF000000
printf("%0x\n",u.c[0]);//小转大0x78563412
printf("%0x\n",u.i);
u.i = ((u.i >> 24) & 0x000000FF) |
((u.i >> 8) & 0x0000FF00) |
((u.i << 8) & 0x00FF0000) |
((u.i << 24) & 0xFF000000);
printf("%0x\n",u.c[0]);//大转小
printf("%0x\n",u.i);
return 0;
}
输出:
12
78563412
78
12345678