判断大小端模式

来源:互联网 发布:c语言可以编安卓软件吗 编辑:程序博客网 时间:2024/05/22 11:44

什么是大小端模式

  1. 大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
  2. 小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
    比如说16bit的数0x1234大小端的存放方式如下表:
内存地址 0x4000 0x4001 Big_endian 0x12 0x34 Little_endian 0x34 0x12

常见的CPU架构一般都是采用小端模式,比如说PC机的X86,还有ARM,DSP。

程序判断大小端模式

常见的有两种,一种是定义一个短整型变量,占2个字节,然后通过强制转换将低地址的数据放到一个char类型的变量,通过判断该变量的值来判断大小端模式,程序如下:

#include <stdio.h>#include <stdlib.h>int main(int argc, char const *argv[]){     short int a = 0x1234;     char b = *(char *)&a;     if( b == 0x12)        printf(" Big Endian\n");     else if (b == 0x34)        printf("Little Endian\n");    return 0;}

第二种方法是利用C语言联合体的性质来判断。在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。因为union 型数据所占的空间等于其最大的成员所占的空间。所以下面的union联合体大小是等于8个字节

union data{    short int a;    char b;    double  c;}data;printf("%d\n",sizeof(data) );

所以不论对哪个变量的存取或访问都是从union 的首地址位置开始,利用这个特性也可以判断大小端模式。

#include <stdio.h>#include <stdlib.h>int main(int argc, char const *argv[]){    union data    {        short int a;        char b;        double  c;    }data;    printf("%d\n",sizeof(data) );    data.a = 0x1234;    if (data.b == 0x12)    {        printf("Big Endian\n");    }    else if (data.b == 0x34)    {        printf("Little Endian\n");    }    return 0;}
0 0
原创粉丝点击