旨在通过案例学习联合体。
大小端全称大小端字节序存储,分为大端字节序存储和小端字节序存储。为什么叫字节序呢?就是以字节为单元来排它的循序。
![](https://i-blog.csdnimg.cn/blog_migrate/737e00c08491d15a73b67e2b5540f793.png)
大小端概念可以在csdn上搜索,很有很清楚的讲解。
下面说一个如何利用联合体或指针来判断大小端以及如何转换的代码。
联合体来判断大小端,就是利用联合体共享内存的特性。
![](https://i-blog.csdnimg.cn/blog_migrate/615cf7195e9e440eee0ab34fde115e24.png)
#include <io_utils.h>
# 判断是不是大小端,利用联合体。
#内存中存的是s的值,但是由于c共享内存,
#所以能通过c查看内存的值,从而判断1存在大端还是小端
int IsBigEndian() {
union {
char c[2];
short s;
} value = {.s=0x100};
return value.c[0] == 1;
}
# 第二种方法,利用指针。
int IsBigEndian2() {
short s = 0x100;
char *p = (char *)&s;
return p[0] == 1;
}
# 大小端转换
int ToggleEndian(int original) {
union {
char c[4];
int i;
} value = {.i=original};
char temp = value.c[0];
value.c[0] = value.c[3];
value.c[3] = temp;
temp = value.c[1];
value.c[1] = value.c[2];
value.c[2] = temp;
return value.i;
}
# 利用指针实现大小端转换
int ToggleEndian2(int original) {
char *p = (char *)&original;
char temp = p[0];
p[0] = p[3];
p[3] = temp;
temp = p[1];
p[1] = p[2];
p[2] = temp;
return original;
}
int main() {
PRINT_INT(IsBigEndian());
int original = 0x12345678;
PRINT_HEX(ToggleEndian(original));
return 0;
}
* (char*)&i表示的意思是将int类型的指针强制转换成(char*)类型的指针,
这样原本指向四个字节的int指针变成了指向一个字节的char类型指针。
&i表示取地址运算,但是地址算是一种指针