CPU大端和小端的判断:【两种方法+源代码】

1:为什么会出现大小端

在计算机系统中,数据是以字节为单位进行存储的。每个地址单元都对应着一个字节,一个字节为8位(bit)。然而,在C语言等编程语言中,除了8位的char类型外,还有16位的short型、32位的int型等数据类型。对于位数大于8位的处理器(如16位或32位处理器),由于寄存器宽度大于一个字节,因此需要将多个字节组合起来以存储一个完整的数据项。这就涉及到了如何将多个字节安排(即字节顺序)的问题,从而导致了大小端模式的出现。

大小端的问题,实质:是字节存储顺序的问题

2:什么是大小端

大端模式(Big Endian):在这种模式下,数据的高位字节(最高有效位)存储在内存的低地址端,而低位字节(最低有效位)则存储在内存的高地址端。

小端模式(Little Endian):与大端模式相反,小端模式将数据的低位字节存储在内存的低地址端,而高位字节则存储在内存的高地址端

3:为什么要进行大小端转换

  1. 跨平台兼容性:由于不同的CPU和操作系统可能采用不同的字节顺序,因此在进行跨平台数据传输或文件存储时,需要特别注意大小端问题。否则,可能会导致数据解析错误或程序崩溃。
  2. 网络传输:在网络传输过程中,数据通常按照网络字节序(大端模式)进行传输。因此,如果主机使用小端模式,则需要在发送数据前进行字节顺序转换。
  3. 文件存储在文件存储过程中,也需要注意大小端问题。如果将一个整数以二进制形式写入文件,在不同的平台上可能会有不同的字节序列。因此,在编写文件处理程序时,需要先将主机字节序转换为固定的字节序列(如大端模式或小端模式)。

4:如何判断系统的大小端模式

常用的方法包括:

a: 直接法

b: 指针法

c: 联合体法

核心思想:通过访问数据的某个字节来判断其在内存中的存储位置,从而确定系统的大小端模式

5:代码实战

方法1:直接法/指针法

/****************************************************************************************************************************************** 
* 函数名称: check_end_1()
* 功能说明: 判断大小端
* 输    入: 无
*			
* 输    出: 无
* 注意事项: 直接法: 1: 判断字符指针指向的第一个字节的值,如果是小端模式,低地址存储的是低位字节,所以*c应该是0x78    
******************************************************************************************************************************************/
void check_end_1(void) 
{  
	u32 x = 0x12345678; 					//设定一个已知的整数值  
	char *c = (char*)&x;         	//将整数的地址转换为字符指针  
	
	if(*c == 0x78)
	{
		printf("[%s]: The system is Little Endian!!! \r\n",__func__);
	}
	else
	{
		printf("[%s]: The system is Big Endian!!! \r\n",__func__); 
	}
}

 方法2:联合体法(原理:成员共享相同的内存空间

/****************************************************************************************************************************************** 
* 函数名称: check_end_2()
* 功能说明: 判断大小端
* 输    入: 无
*			
* 输    出: 无
* 注意事项: 联合体法: 1: 判断字符指针指向的第一个字节的值,如果是小端模式,低地址存储的是低位字节,所以*c应该是0x78    
******************************************************************************************************************************************/
void check_end_2(void) 
{  
	union{  
		
		unsigned int i;  
		unsigned char c[sizeof(unsigned int)];  
		
	}test_union;    
	
	test_union.i = 0x12345678; 									// 设定一个已知的整数值 
	
	if(test_union.c[0] == 0x78)
	{
		printf("[%s]: The system is Little Endian!!! \r\n",__func__);
	}
	else
	{
		printf("[%s]: The system is Big Endian!!! \r\n",__func__); 
	}
} 

 运行结果:(用的MCU是:STM32F103C8T6)

好了,大家可以在自己的硬件平台上实战起来,一般通常MCU都是小端模式!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/885278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot+Activiti7工作流入门实例

目录 文章目录 目录准备Activiti建模工具1、BPMN-js在线设计器1.1 安装1.2 使用说明1.3运行截图2、IDEA安装Activiti Designer插件2.1安装插件2.2 设置编码格式防止中文乱码2.3 截图简单工作流入门实例1. 新建Spring Boot工程2. 引入Activiti相关依赖添加版本属性指定仓库添加依…

C语言扫盲

文章目录 C版本C语言特征GCCprintf数据类型函数指针内存管理void指针 Struct结构和Union结构typedef预处理器make工具cmake工具Projectintegral of sinc functionemulator embedded systeman event schedule 补充在线Linux终端安装Linux参考 建议还是国外教材学习…人家的PPT比…

HBase DDL操作代码汇总(namespace+table CRUD操作)

HBase DDL操作 DDL操作主要是关于命名空间和表格的内容增删改查。 注:如果出现无法连接到zookeeper等的相关错误,可以将以下代码打jar包,在HMaster节点上执行 错误提示: Exception in thread “main” java.net.SocketTimeoutExc…

sql server每天定时执行sql语句

sql server每天定时执行sql语句 1、打开SQL Server Management Studio 2、鼠标右击【SQL Server 代理】,选择【启动(S)】,如已启动,可以省略此步骤; 3、右键,新建-》作业,在作业上-》新建作业&#xff…

TypeScript是基于LLM上层研发的受益者

TypeScript优在哪里 TypeScript是一种由微软开发的开源编程语言,它是JavaScript的一个超集,添加了类型系统和一些其他特性。TypeScript的优势在于: 静态类型检查:TypeScript的最大卖点是它的静态类型系统。这允许开发者在编写代码…

Pytest自动化测试执行环境切换的2种解决方案

一、痛点分析 在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、UAT环境、线上环境等等,并且在DevOps理念中,往往自动化都会与Jenkins进行CI/CD,不论是定时执行策略…

ELK-03-skywalking监控linux系统

文章目录 前言一、下载node_exporter二、启动node_exporter三、下载OpenTelemetry Collector四、启动OpenTelemetry Collector4.1 将配置文件下载到同级目录4.2 启动 五、查看总结 前言 skywalking安装完成后,开始我们的第一个监控-监控linux系统。 参考官方文档&a…

AI知识库如何重塑电商行业的产品推荐系统

在数字化浪潮的推动下,电子商务行业正经历着前所未有的变革。其中,产品推荐系统作为连接消费者与商品的桥梁,其智能化与个性化水平直接影响着用户体验、转化率乃至整个平台的竞争力。随着人工智能(AI)技术的飞速发展&a…

灵当CRM index.php接口SQL注入漏洞复现 [附POC]

文章目录 灵当CRM index.php接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 灵当CRM index.php接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技…

Oracle Data Guard备库清理归档脚本

1 说明 我们知道在Oracle Data Guard架构中归档模式是必须打开的,主库将日志传输到备库,最终存放到备库的归档日志文件中。随着系统的运行,归档日志文件会不断累积,如果不及时清理,则会造成归档空间被写满&#xff0c…

java项目之社区智慧养老监护管理平台设计与实现源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的社区智慧养老监护管理平台设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 社区…

Linux工具的使用——yum和vim的理解和使用

目录 linux工具的使用1.linux软件包管理器yum1.1yum的背景了解关于yum的拓展 1.2yum的使用 2.Linux编辑器-vim使用2.1vim的基本概念2.2vim的基本操作2.3命令模式命令集2.3.1关于光标的命令:2.3.2关于复制粘贴的命令2.3.3关于删除的命令2.3.4关于文本编辑的命令 2.4插…

MAC M1 安装brew 配置环境变量,安装dart

一. 下载 brew 1. 终端输入 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 2. 如遇到下载失败情况,需要VPN/代理 curl: (7) Failed to connect to raw.githubusercontent.com port 443 after 8 m…

【2025】springboot基于微信小程序记账本的设计与实现(源码+文档+调试+答疑)

文章目录 前言一、主要技术?二、项目内容1.整体介绍(示范)2.运行截图3.系统测试 总结更多项目 前言 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,记账本小…

SpringBoot+Thymeleaf发票系统

> 这是一个基于SpringBootSpringSecurityThymeleafBootstrap实现的简单发票管理系统。 > 实现了用户登录,权限控制,客户管理,发票管理等功能。 > 并且支持导出为 CSV / PDF / EXCEL 文件。 > 本项目是一个小型发票管理系统…

基于SpringBoot的休闲娱乐代理售票系统设计与实现

1.1研究背景 21世纪,我国早在上世纪就已普及互联网信息,互联网对人们生活中带来了无限的便利。像大部分的企事业单位都有自己的系统,由从今传统的管理模式向互联网发展,如今开发自己的系统是理所当然的。那么开发休闲娱乐代理售票…

探索私有化聊天软件:即时通讯与音视频技术的结合

在数字化转型的浪潮中,企业对于高效、安全、定制化的通讯解决方案的需求日益迫切。鲸信,作为音视频通信技术的佼佼者,凭借其强大的即时通讯与音视频SDK(软件开发工具包)结合能力,为企业量身打造了私有化聊天…

Linux 应用层自定义协议与序列化

文章目录 一、应用层1、协议2、序列化 && 反序列化3、通过Json库进行数据的序列化 && 反序列化Json::Value类Json::Reader类Json::Writer类 二、为什么read、write、recv、send和Tcp支持全双工?发数据的本质:tcp支持全双工通信的原因&am…

docker学习笔记(1.0)

docker命令 下载镜像相关命令 检索:docker search 比如:docker search nginx 是查看有没有nginx镜像 后面的OK表示是不是官方镜像,如果有就是官方镜像,如果没有就是第三方的。 下载:docker pull 比如&#xff1a…

联宇集团:如何利用CRM实现客户管理精细化与业务流程高效协同

在全球化的浪潮中,跨境电商正成为国际贸易的新引擎。作为领先的跨境电商物流综合服务商,广东联宇物流有限公司(以下称“联宇集团”)以其卓越的物流服务和前瞻的数字化战略,在全球市场中脱颖而出。本文将基于联宇集团搭建CRM系统的实际案例&am…