详解大端序和小端序(c语言实现)

1 大端序和小端序介绍

        大端存储方式:数据的低位存储到内存的高地址中,数据的高位存储到内存的低地址中

        小端存储方式:数据的低位存储到内存的低地址中,数据的高位存储到内存的高地址中

2 字节序和高低地址

        比如一个数0x11223344。

2.1 字节序

        高位字节--->低位字节 0x11223344,从左到右,由高位字节到低位字节 因此bit的顺序是从右到左递增的 (... bit9 bit8 bit7 bit7 bit5 bit4 bit3 bit2 bit1 bit0)。

2.2 高地址和低地址

        内存中的地址有高低地址,由于数据在内存中存储是按照字节来存储的,因此就产生了大端和小端的存储方式。

         地址一般是:低地址--->高地址,

        因此对于0x11223344这个数在内存中的存储方式是:

        大端:1122 3344

        小端:4433 2211

3 大小端判断方式

      c语言两种方式判断系统的大小端:强制类型转换和联合体。

        联合体类似与结构体,都是不同元素的集合,但是联合体的成员共用一块内存空间,因此在一定程度上可以节约空间。联合体的大小一般是其最大成员的大小,但是字节对齐时需要补齐,空间也会变大。对联合体的一个成员的修改会导致另一个成员的改变,通过这个特性,可以用其来判断系统的大小端。

3.1 强制类型转换判断

#include

int is_byteorder(int *p)

{

return *((char *)p);

}

int main(int argc, char *argv[])

{

int n = 1; // 0x00000001

n = is_byteorder(&n);

if (n==1)

{

printf("小端\n");

}

else

{

printf("大端\n");

}


 

}

3.2 联合体判断

#include

union un_big_little_endian

{

int a;

char b;

};

int is_byteorder_unin(int *p)

{

union un_big_little_endian temp;

temp.a = *p;

return temp.b;

}


 

int main(int argc, char *argv[])

{

int n = 1; // 0x00000001

n = is_byteorder_unin(&n);

if (n==1)

{

printf("小端\n");

}

else

{

printf("大端\n");

}


 

}

你可能感兴趣的:(C++精进之路,c语言,开发语言,c++)