计算机最小的存储单位是 位(Bit),但是,计算机中最基本的存储单位是字节(Byte)。
1 Byte = 8 Bit
计算机在存储大于1字节的数据时,会将这个数据拆分为多个字节,再将它们按顺序存储起来,存储和读取这些字节的顺序,就是字节序。
定义分类字节序(Endianness),即计算机在存储或读取数据时,字节的顺序。
字节序分为 大端序(Big endian)和 小端序(Little endian)。
- 大端序:高位字节在前,低位字节在后。
- 小端序:低位字节在前,高位字节在后。
人读写数字的顺序就是大端序,人在读(写)数字时,总是先读(写)高位,再读(写)低位。
例如:对于数字520
- 在写数字的时候,先写5,再写2,最后写0
- 在读数字的时候,先读5,再读2,最后读0
而在计算机的存储中,一般都是小端序存储。
同时,还有主机序和网络序的概念:
- 主机序 是 小端序。
- 网络序 是 大端序。
-
判断计算机是大端序还是小端序
#include
union { short a; char b[2]; } un; int main() { un.a = 0x1234; if(un.b[0] == 0x34) { printf("小端序"); } else if(un.b[0] == 0x12) { printf("大端序"); } return 0; } 说明
C语言中,short是16位整数,所以会被拆成两个字节存储,我们将一个short类型的整数赋值为0x1234,如果它先存储0x34(即它的低位字节),就是小端序;反之,如果它先存储0x12(即它的高位字节),就是大端序。
-
利用指针转换字节数组和基本类型
-
字节数组转short(单个数字)
#include
int main() { char chs[2] = {0x34, 0x12}; // 小端序数据0x1234 short a = *((short*)chs); printf("0x%X", a); // 输出0x1234 return 0; } -
字节数组转short(多个数字)
#include
int main() { char chs[4] = {0x34, 0x12, 0x78, 0x56}; // 小端序数据0x1234, 0x5678 short a = *((short*)chs); short b = *((short*)(chs+2)); printf("0x%X n", a); // 输出0x1234 printf("0x%X n", b); // 输出0x5678 return 0; } -
short转字节数组
#include
int main() { char chs[2]; short a = 0x1234; for(int i = 0; i < 2; i++) { chs[i] = ((char*)&a)[i]; } // 小端序计算机将输出: chs[0]=0x34, chs[1]=0x12 printf("chs[0]=0x%X n", chs[0]); printf("chs[1]=0x%X n", chs[1]); return 0; }
-
利用联合体转换字节数组和基本类型
#include
union { short a; char chs[2]; } un; int main() { //将short转换为字节数组// un.a = 0x1234; // 小端序计算机将输出: chs[0]=0x34, chs[1]=0x12 printf("chs[0]=0x%X n", un.chs[0]); printf("chs[1]=0x%X n", un.chs[1]); //将字节数组转换为short// un.chs[0] = 0x78; un.chs[1] = 0x56; printf("a=0x%X n", un.a); // 输出0x5678 return 0; }



