大小端存储

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大小端存储相关的知识,希望对你有一定的参考价值。

参考技术A 在计算机系统中,存储是以字节为单位的,每个地址单元都对应着一个字节,一个字节=8bit。在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器)。对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,如何安排多个字节的存储,这就有了大端存储模式和小端存储模式。

小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。

大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。

如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示。

C语言判断大小端模式

方法一:

voidIsBigEndian()



    shortinta=0x1122; //十六进制,一个数值占4位charb =  *(char*)&a;//通过将short(2字节)强制类型转换成char单字节,b指向a的起始字节(低字节)

    if( b ==0x11) //低字节存的是数据的高字节数据

    

        //是大端模式

    

    else

    

        //是小端模式

    



方法二:

voidIsBigEndian() //原理:联合体union的存放顺序是所有成员都从低地址开始存放,而且所有成员共享存储空间



    uniontemp

    

        shortint a;

        char b;

    temp;

    temp.a=0x1234;

    if(temp.b==0x12) //低字节存的是数据的高字节数据

    

        //是大端模式

    

    else

    

        //是小端模式

    



参考:https://www.jianshu.com/p/152268b0ea19

嵌入式快充:内存大小端

嵌入式快充:内存大小端

一、大小端概念

目前大多数计算机中,存储的基本单元是一个字节,对应着8位长度,当存储8位以上的单元,比如:字(16位)、双字(32位)时,他们是拆分成8位进行存储的,因为存储空间是一个连续的地址,如果我们要存储一个16进制的数,他可以分为高8位字节和低8位字节数据,如果高8位字节的数据放在高地址,低位8位数据放在低地址,为小端存储,相反如果高8位数据放在低地址,低8位数据放在高地址,则为大端存储,具体可以由下图表示:

二、使用C判断当前机器大小端

使用C语言判断大小端,我们可以先定义一个16位的已知数据,使用一个char指针强制指向已知数据的地址(指向的是低地址),然后我们以16进制打印指针指向地址的数据

#include <stdio.h>
int main(void)
{
    unsigned short u16;
    unsigned char* u8;
    u16 = 0x1234;
    u8 = (unsigned char*)&u16;
    printf("%x",*u8);
    return 0;
}

运行后结果如下

可以看到打印的是0x34,对应的是0x1234的低地址数据,所以当前计算机的存储方式为小端存储

以上是关于大小端存储的主要内容,如果未能解决你的问题,请参考以下文章

大小端存储在哪一章

计算机中整数的存储与大小端

大小端

大小端存储

大小端

关于大小端问题和字节序问题的一些总结