C语言中的大小端

文章目录

      • 1.什么是大小端
      • 2.大小端的意义
      • 3.如何确定大小端
        • 3.1使用联合体来检测
            • 3.1.1联合体
            • 3.1.2代码检测
        • 3.2使用指针来检测

1.什么是大小端

大小端是内存存储字节的两种方式,一个是大端存储,一个是小端存储。采用大小模式对数据端进行存放的主要区别在于存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存放在高地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。

大端存储:就是把一个数的低位字节序的内容存放到高地址处,高位字节序的内容存放在低地址处。
小端存储:就是把一个数的低位字节序的内容存放到低地址处,高位字节序的内容存放在高地址处。

2.大小端的意义

互联网使用的网络字节顺序采用大端模式进行编址,而主机字节顺序根据处理器的不同而不同,如PowerPC处理器使用大端模式,而Pentuim处理器使用小端模式

由于PowerPC处理器主导网络市场,可以说绝大多数的通信设备都使用PowerPC处理器进行协议处理和其他控制信息的处理,这也可能也是在网络上的绝大多数协议都采用大端编址方式的原因。因此在有关网络协议的软件设计中,使用小端方式的处理器需要在软件中处理端模式的转变。

Pentium主导个人机市场,因此多数用于个人机的外设都采用小端模式,包括一些在网络设备中使用的PCI总线,Flash等设备,这也要求硬件工程师在硬件设计中注意端模式的转换。

3.如何确定大小端

3.1使用联合体来检测

3.1.1联合体

在检测大小端之前,让我们先了解一下C语言中的联合体是什么?
在C语言中,联合体也被称为共用体,它的关键字是union
定义一个联合类型的一般形式为:

union 联合名
{
     
	成员表
};

联合体占用的字节数与其成员中最大数据类型占用的字节数相等,例如:

union Un
{
     
	int a;
	char b;
}un;

该联合体中成员a是int类型占四个字节,成员b是char类型占一个字节,所以该联合体Un在内存中占四个字节,并且联合体中的成员能够公用一个内存空间,内存可以这样表示:
C语言中的大小端_第1张图片
由于联合体的特性,通过截取b,即可知道字节序的存放方式,即可知道是大端机还是小端机。

3.1.2代码检测
#include 
int Check_sys()
{
     
    union Un
    {
     
        char c;
        int i;
    }un;
    un.i = 1;
    //如果是大端机则是0x1000 0000 0000 0000
    //如果是小端机则是0x0000 0000 0000 0001
    return un.c;
}

int main()
{
     
    int ret=Check_sys();//由于联合体的特性,大端机ret=0(0000),小端机ret=1(0001)
    if (1 == ret)
    {
     
        printf("当前模式为小端存储\n");
    }
    else
    {
     
        printf("当前模式为大端存储\n");
    }
    return 0;
}

输出结果:
C语言中的大小端_第2张图片

3.2使用指针来检测

一个 int 的指针每次偏移的是4个字节,而一个 char 类型的指针每次偏移的是一个字节,那么就可以类似于上面联合体的方式截取内存中的字节来进行大小端的判断

int Check_sys()
{
     
	int a = 1;
	char* p = (char*)&a;
	return *p;  //大端返回0,小端返回1
}
int main()
{
     
	int ret = Check_sys();
	if (1 == ret)
	{
     
		printf("当前模式为小端存储\n");
	}
	else
	{
     
		printf("当前模式为大端存储\n");
	}
	return 0;
}

检测结果:
C语言中的大小端_第3张图片

你可能感兴趣的:(c语言)