大端模式与小端模式

来源:互联网 发布:qq手机骂人软件 编辑:程序博客网 时间:2024/06/11 16:20

大端模式与小端模式

有时候,用C语言写程序时需要知道是大端模式还是小端模式。

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

高数据位与低数据位

inta=46178;

00000000 0000 0000 1011 0100 0110 0010 二进制

左侧是数据高位,向右依次降低。

重点在理解这个高低位

4字节内存地址

 


这是一个整型4字节内存,a要存在这段内存中,内存地址顺序递增,由低地址位 递增 到高地址位。

 

大端存储:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中;

 

误区:数据不是原模原样存进去,是按二进制形式存储的。

比如:int a=46178;不是1占一个字节,2占一个字节,3占一个字节,4占一个字节。

 

小端存储:(小高高,小低低),字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中;

 

测试我们系统大小端的存储方法:思路就是看第一个字节的值是多少。一般使用联合体测试。

联合体特点:所有成员起始地址一致,所有成员引用的是内存中的相同位置。

测试用例

#include<stdio.h>

#include<windows.h>

/////////////////////////////////////

//////大端模式与小端模式测试////////

///////////////////////////////////

int main()

{

    //(方法1)联合体

    union

    {

       inta;

       chararray[4];

    }b = {46178 };

    printf("%d,%d,%d,%d", b.array[0], b.array[1], b.array[2],b.array[3]);

    //(方法2)法类型转换

    inta = 46178;

    char*p = (char*)&a;

    printf("%d,%d,%d,%d",*p,*(p+1),*(p+2),*(p+3));

    //方法1与方法2运行结果: 98,-76,0,0

    //数据的低数据位放在内存的低地址,故本机器为小端模式存储

    //X86一般为小端存储

    system("pause");

    return0;

}

////测试函数

int CheckSystem()

{

    union check

    {

       inti;

       charch;

    }c;

    c.i = 1;

    return(c.ch == 1);

}

 

 

0 0
原创粉丝点击