C语言中的大小端

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在内存中占四个字节,并且联合体中的成员能够公用一个内存空间,内存可以这样表示:
在这里插入图片描述
由于联合体的特性,通过截取b,即可知道字节序的存放方式,即可知道是大端机还是小端机。

3.1.2代码检测
#include <stdio.h>
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;
}

输出结果:
在这里插入图片描述

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;
}

检测结果:
在这里插入图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值