首先这里的大端小端是一种计算机的储存模式。下来我们来看看它是什么东西。
大端模式(大端字节序):字数据的高字节储存在低地址中,而字数据的低字节则存放在高地址中。
小端模式(小端字节序):字数据的高字节储存在高地址中,而字数据的低字节则存放在低地址中。
在这里我们以整形为例子:a=20;
我们知道20的二进制是 00000000 00000000 00000000 00010100
十六进制是 00(高位) 00 00 14(低位)
大端模式: (低地址) 00 00 00 14(高地址)
小端模式: 14 00 00 00
比如这么一段简单的代码,你知道a是怎么储存的吗?
#include<stdio.h>
int main()
{
int a = 20;
system("pause");
return 0;
}
这里我们可以这样查看内存进行&a来看我们是大端还是小端模式
我们可以通过很多方法得到我们是大端模式还是小端模式。
当然我们可以直接通过上面直接看内存的方式得到。
但是如果不看内存应该怎么知道是哪种模式,是大端字节序还是小端字节序呢?
方法1:
我们先来分析一下就拿刚讲过的a=20为例子
我们知道20的二进制是 00000000 00000000 00000000 00010100
十六进制是 00(高位) 00 00 14(低位)
大端模式: (低地址) 00 00 00 14(高地址)
小端模式: 14 00 00 00
在这里我们要知道int型占四个字节而八个比特位表示一个字节
char型占一个字节
我们可以看到两种模式低地址不一样,那么我们是不是可以判断低地址的值来判断呢?
我们可以定义一个值a=1,为什么让a=1呢?
我们可以看到 a的16进制是 00 00 00 01
如果是小端模式的话低地址就是01,相反就是00
那我们把b的地址拿出来然后让a的地址强制类型转换,char b=(char )&a;因为char *占一个字节,所以只取了内存的最低字节00或01,如果最后b==1的话,就说明低地址存的低位,就是小端,否则就是大端。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 1;
char * b = (char *)&a;
if (b == 1)
printf("小端!");
else
printf("大端!");
system("pause");
return 0;
}
方法二:
这个方法我们要用到联合体union。
关键字union
主要性质是:在union中所有的数据成员共用一个空间,同一时间只能储存其
中一个数据成员,所有的数据成员具有相同的起始地址。
知道了他的性质怎么用它判断大小端呢?
因为union中的结构成员具有相同的起始位置,和方法中原理差不多,还是因为int
占四个字节,而char只占一个字节,我们可以在union结构中定义一个int类型,
一个char类型,然后我们给整形赋值为1,un.i=1,因为char只占一个字节而又
共用同一空间所以不得已,char类型变量只能取低地址然后我们再判断char类型变量
是1还是0,从而判断是大端还是小端。
#include<stdio.h>
int main()
{
union un
{
int i;
char c;
}c;
c.i = 1;
if (c.c == 1)
{
printf("小端");
}
else
{
printf("大端");
}
system("pause");
return 0;
}