目录1.什么是大小端2.为什么会出现大端和小端以及是不是只有大端和小端3.怎样编写程序判断当前机器是大端还是小端4.怎样编写程序进行大小端的转换1.什么是大端和小端大端Big-Endian和小端Little-Endian是两种不同的字节序Byte Order用于描述多字节数据在计算机内存中的存储顺序。注意大端和小端针对的是字节而1byte 8bit)大端数据的高位字节存储在低地址低位字节存储在高地址。小端数据的低位字节存储在低地址高位字节存储在高地址。2.为什么会出现大端和小端以及是不是只有大端和小端在计算机系统中我们是以字节为单位的每个地址单元都对应着一个字节一个字节等于8个bit位。但是在C语言中除了8bit的char型还有16bit的short型,32bit的long型当然要看具体的编译器。另外对于位数大于8位的处理器例如16位和32位的处理器由于寄存器宽度大于一个字节那么必然存在着一个如何将多个字节进行安排的问题因此就导致了大端存储模式和小端存储模式。就拿上面的十六进制数0x11223344来说我们都知道一位十六进制数可以用4位二进制数表示那么两个十六进制数就是8个bit位那么如何存储0x11223344呢那么根据数学知识有4*3*2*124种可能下面列举其中几个来说明问题我们不仅要存储数据还要使用数据所以数据存储的方式越简单当我们要使用数据的时候才会更容易拿出所要的的数据所以乱序的数据存储方式是不提倡的因此出现了目前主流的大端和小端的存储模式。但不代表只有这两种存储模式我们前面也说了有24种可能只是其中一些存储规则比较复杂不便于我们后续提取数据。3.怎样编写程序判断当前程序是大端还是小端这里我们提供两种方式3.1使用联合体#includestdio.h int main() { //使用联合体 union Un { char i; int j; }; union Un un; un.j 0x11223344;//0x11223344 //00010001 00100010 00110011 01000100 if (un.i 0x44) { printf(小端\n); //01000100 00110011 00100010 00010001 } else if (un.i 0x11) { printf(大端\n);//00010001 00100010 00110011 01000100 } return 0; }char i 和 int j 共用一块内存空间 因此我们可以通过访问i间接访问到j的第一字节的内容从而实现大小端的判断3.2使用指针int main() { int i 0x11223344; char* p (char*)i; if (*p 0x11) printf(大端\n); else if (*p 0x44) printf(小端\n); return 0; }4.怎样编写程序进行大小端的转换4.1使用指针int to_opposite_endian(int data) { char* tmp (char *)data; int i 0; for (i 0; i 2; i) { char ch *(tmpi); *(tmp i) *(tmp 3 - i); *(tmp 3 - i) ch; } return data; } int main() { int i 0x11223344; printf(original:%x\n, i); int ret to_opposite_endian(i); printf(exchange:%x\n, ret); return 0; }我们只需要两次循环将第一字节和第四字节进行交换第二字节和第三字节进行交换就可以实现大小端的转换4.2使用位移操作符int to_opposite_endian(int data) { return ((data 0x000000ff) 24) | ((data 0x0000ff00) 8) | ((data 0x00ff0000) 8) | ((data 0xff000000) 24); } int main() { int i 0x11223344; printf(original:%x\n, i); int ret to_opposite_endian(i); printf(exchange:%x\n, ret); return 0; }感谢阅读如果你从这篇博客中get到了新知识或者终于搞明白了大小端这个“字节序界的甜咸之争”不妨动动小手点赞——给博主加个鸡腿电子版也行关注——下次更新不迷路带你继续C语言“挖坑”与“填坑”之旅要是你边看边笑出了声……那一定是因为代码太优雅绝对不是博主在讲冷笑话。如果有疑问或想吐槽欢迎评论区留言——毕竟程序员之间的交流往往从“你这段代码有大端问题”开始