C语言判断大小端

    技术2022-07-11  120

    大小端介绍

    中央处理器(CPU:CentralProcessingUnit)和微处理器(MCU:MicrocontrollerUnit)中的存储单元都有存储单元,用来存放程序代码中申请的变量(存在栈区),CPU/MCU的最小存储单元是一1个字节(1Byte)即8bit。 C语言中有多种变量类型如:char(8bit)、short(16bit)、int(32bit)、long long(64bit),其中char类型刚好是一个最小存储单元的大小,那么char型变量就用一个存储单元来存放;但是short、int等变量都比最小存储单元大,这个时候想要存储short、int就只能用几个存储单元来存放。 在存储器中,存储单元的地址是相连的,用几个存储单元来存放变量,就要考虑存放方式。而大小端就是一种数据在存储空间中的存放方式,下面介绍大小端模式,以int a = 0x12345678(16进制数)作为参考数据,0x00,0x01,0x02,0x03为参考地址。

    上面的变量a中,跟十进制中个十百千万一样,1是最高位,8是最低位。 上面的地址中0x00是最低地址,0x03是最高地址。 有了这两个概念,大小端就很好明白了。

    1、大端模式:**低地址**存**高字节** 地址:0x00 0x01 0x02 0x03 数据:0x12 0x34 0x56 0x78 2、小端模式:**低地址**存**低字节** 地址:0x00 0x01 0x02 0x03 数据:0x78 0x56 0x34 0x12

    注意仔细观察上面两者的区别!!!

    怎么判断大小端

    有了大小端的概念,现在就来解决提出的问题:数据在存储器中的存储方式是大端还是小端?怎么判断?首先肯定是百度咯,如果是CPU(电脑芯片),那百度搜一下芯片手册看一下的数据存储模式;如果是MCU,厂家会给芯片手册,翻一下手册就行,没有手册的,可以去芯片公司官网看看有没有相关资料。如果这个方法行不通,那就软件来解决,使用C语言很简单的几行代码就可以判断出来。

    C语言判断大小端方法1

    int型变量是32bit,而char*指针每次只会从指向的地址上访问char类型大小(8bit)的空间,利用这个原理,就可以用下面的代码来测试了:

    #include <stdio.h> int main(void) { int a = 0x12345678; int *pa = &a; char *p = (char*)(&a); cahr b = *pa; printf("%x",*p);//如果结果是12就是大端,否则就是小端 //printf("%s",((*p)==0x12)?("大端"):("小端")); //printf("%s",((char)a == 0x12)?"大端":"小端"); //printf("%s",(b == 0x12)?"大端":"小端"); /*上面四个printf都可以测试*/ return 0; }

    这里a尽量用16进制数,换成10进制不能直观看出来,具体为什么,把12345678和0x12345678都换成二进制比较一下就知道什么原因了。

    C语言判断大小端方法2

    利用联合数据类型来判断,定义的联合体可以兼容很多种类型的数据,利用这个特点可以定义一个包含int和char类型的联合体来测试:

    #include<stdio.h> union UNION{ int a; char b; }union_test; int main(void) { union_test.a=0x12345678; printf("%s\n",(union_test.b == 0x78)?"小端":"大端"); return 0; }

    我们给int成员赋值,但是与此同时其他成员b也是可以使用的,但是b的值是从联合体的起始地址往后1个字节上的内容(因为b是char类型),a的值是从联合体的起始地址往后4个字节上的内容(因为a是int类型),如果处理器是大端存储,那么第一个字节就会存放高位(0x12),如果是小端存储,那么第一个字节就存放低位(0x78)。

    Processed: 0.009, SQL: 9