什么是大小端,如何写程序判断大小端?

什么是大小端?

        大小端又被成为 大端字节序小端字节序 。大小端其实指的就是在数据如何存到内存中的方式。

        接下来 来看一个数据 0x12345678 在不同模式下的存储方式:

图1


在 VS 的编译环境下:

图2

可以清晰的看到 a 在内存中的存储情况。a 的高位字节 0x12 存在了内存 0x00B1FE57,

                                                                    而低位字节 0x78 存在了内存 0x00B1FE54

故在此环境下内存的存储方式是 小端存储 ,同理大端字节序存储方式也是类似的。


那么如何记忆呢?  

1. 大端不变小端变(内存从低到高,大端存储数据和原数据一样放入;小端则倒序放入)

2. 低字节存低地址是小端;低字节存高地址是大端


如何写一个程序判断当前环境是大端还是小端存储方式?

        首先已经知道了数据在内存中存储的方式。为了方便计算取数字 1 来举例。

内存低地址-------------------->内存高地址

在 大端中  0x 00 00 00 01

在 小端中  0x 01 00 00 00

所以只要写一个程序能够取出数据的第一个字节,如果取出的是 1 说明是小端;0 则是大端

下面提供两种方法:

//方法一: 用 char* 访问一个字节的方法
int main()
{int a = 1;char* p = (char*)&a;if (*p == 1)printf("小端\n");elseprintf("大端\n");return 0;
}//方法二: 用 联合体 共用一块空间的方法
union 
{char c;int i;
}un;
int main()
{int a = 1;un.i = 1;if (un.c == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

再将上面两种方法封装一下,封装成判断大小端函数。

//返回1是小端 返回0是大端
int check1()
{int a = 1;return *(char*)&a;
}int check2()
{union{char c;int i;}un;un.i = 1;return un.c;
}int main()
{int ret = check1();if(ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

以上就是判断大小端的方法,当有两个字节以上数据才会有大小端的排序。

本文链接:https://my.lmcjl.com/post/10306.html

展开阅读全文

4 评论

留下您的评论.