(1)采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位(一个字节大小)存放在低地址,小端方式将低位存放在高地址(储存都是一个一个字节的)。采用大端方式 进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char(这种数据刚好是储存一个字节)之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
(2)在32 位的系统上
char 咔出来的内存大小是1 个byte。
short 咔出来的内存大小是2 个byte;
int 咔出来的内存大小是4 个byte;
long 咔出来的内存大小是4 个byte;
float 咔出来的内存大小是4 个byte;
double 咔出来的内存大小是8 个byte;
(注意这里指一般情况,可能不同的平台还会有所不同,具体平台可以用sizeof 关键字测试一下)
如果将一个16位的整数0x1234存放到一个短整型变量(short:占两字节)中。这个短整型变量在内存中的存储在大小端模式由下表所示。(储存总是从低字节开始,也就是说一个储存区首地址是指其最低地址)
地址偏移
大端模式
小端模式
0x00
12(OP0)
34(OP1)
0x01
34(OP1)
12(OP0)
(3)程序
程序1:
- #include <stdio.h>
- int main()
- {
- short int x;
- char x1,x2;
- x = 0x1122;
- x1 = ((char *)&x)[0]; //低地址
- x2 = ((char *)&x)[1]; //高地址
- printf("x1=%x\n",x1);
- printf("x2=%x\n",x2);
- return 0;
- }
若x1=0x11,则是大端; 若x2=0x22,则是小端......
或:程序2:
点击(此处)折叠或打开
- #include<stdio.h>
-
- int main()
- {
- int x = 1;
- char *p = (char *)&x; //p指向x的首地址(最低地址)
-
- if(*p)
- {
- printf("little\n");
- }
- else
- {
- printf("large\n");
- }
- return 0;
- }