大端小端模式
"大端小端模式" 大端小端模式是计算机系统中的一种存储模式,指的是数据在内存中的存储顺序。根据数据的高位和低位在内存中的存储顺序,大端小端模式可以分为两种:大端模式和小端模式。 大端模式是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。例如,在大端模式下,16位宽的数 0x1234 在内存中的存放方式为:内存地址 0x4000 存放内容 0x12,内存地址 0x4001 存放内容 0x34。 小端模式是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。例如,在小端模式下,16位宽的数 0x1234 在内存中的存放方式为:内存地址 0x4000 存放内容 0x34,内存地址 0x4001 存放内容 0x12。 为什么会有大小端模式之分呢?这是因为在计算机系统中,是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在 C 语言中除了 8bit 的 char 之外,还有 16bit 的 short 型,32bit 的 long 型(要看具体的编译器),另外,对于位数大于 8 位的处理器,例如 16 位或者 32 位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。 常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式,很多的 ARM,DSP 都为小端模式,有些 ARM 处理器还可以由硬件来选择是大端模式还是小端模式。 那么,我们如何判断 CPU 是哪种模式的呢?有多种方法可以实现: 1. 利用联合体 union 的存放顺序是所有成员都从低地址开始存放。通过检查低地址的数据,可以判断 CPU 是大端还是小端。例如: ```c int checkCPU( ){ union w { int a; char b; } c; c.a = 1; return(c.b ==1); } ``` 2. 使用指针强制转换获取数据。例如: ```c short int x; char x0,x1; x=0x1122; x0=((char*)&x)[0]; //低地址单元 x1=((char*)&x)[1]; //高地址单元 if x0=0x11,则是大端; 若 x0=0x22,则是小端 ``` 3. 使用 bits 操作判断。例如: ```c int big_endian (void){ union{ long l; char c[sizeof(long)]; }u; u.l = 1; return (u.c[sizeof(long) - 1] == 1); } ``` 大端小端模式是计算机系统中的一种存储模式,对于不同的 CPU 架构和编译器,可能会有不同的存储模式。了解大端小端模式是非常重要的,因为它关系到数据在内存中的存储顺序和读取方式。