CPU大小端

大端模式:是指数据的低位保存在内存的高地址,而数据的高位,保存在内存的地址中,

小端模式:是指数据的低位保存在内存低地址中,而数据的高位保存在内存的高地址中,

          为什么会有大小端之分,我们是以字节为单位,每个地址单元都对着一个字节,一个字节为8bit,但是在C语言中除了8bit char之外,还有16short型,对于大多数

打印8位处理器,例如16或32位处理器,由于处理器宽度大于一个字节,那么必然存在一个如何将多个字节安排的问题,因此就导致了大端存储或小端存储模式,

例如16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,0x11为高字节,0x22为低字节,对于大端模式,就将0x11放在低地址,即0x22放在高地址中,即

0x0010中,0x22放在高地址中,即0x0011中,小端模式,刚好相反。

     我们常用的X86结构是小端模式,而KEIL C51则为大端模式,很多的ARM,DSP都为小端模式,有些ARM处理器还可以由硬件来选择是大端模式还是小端模式

 

16bit宽度的数据0x1234 在小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

     内存地址     0x4000      0x4001

    存放内容      0x34            0x12

 

在大端模式CPU内存中存放方式则为:

   内存地址  0x4000            0x4001

    存放内容   0x12                0x34

 

从内存地址0x0000开始有以下数据

0x0000     0x12

0x0001     0x34

0x0002     0xab

0x0003     0xcd

    如果我们去读取一个地址为0x0000的四个字节变量

       大端模式:读出来的结果0x1234abcd;

     小端模式: 读出来的结果0xcdab3412;

 

如果我们将0x1234abcd写入到0x0000开始的内存中,则结果为:

                         大端               小端

0x0000            0x12               0xcd

0x0001            0x12               0xab

0x0002            0xab                0x34

0x0003             0xcd               0x12

 

下面判断大小端函数

 int checkCPUendian()  //返回1 小端 反之为大端

{

     union

     {

             unsigned int a;

             unsigned char b;

     }c;

      c.a=1;

       return  1==c.b;

}

 

 

 

 

 

你可能感兴趣的:(C语言理解)