C语言大小端问题剖析

C语言中的大小端 文章目录1.什么是大小端2.大小端的意义3.如何确定大小端3.1使用联合体来检测 1.什么是大小端 大小端是内存存储字节的两种方式,一个是大端存储,一个是小端存储。采用大小模式对数据端进行存放的主要区别在于存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存放在高地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。 大端存储:就是把一个数的低位字节序的内容存放到高地址处,高位字节序的内容存放在低地址处。 小端存储:就是把一个数的低位字节序的内容存放到低地址处 阅读详情

    在C语言中,常常会遇到判断CPU大小端的问题,在很多的笔试面试中经常会出现类似的题目,网络编程中也会进程遇到类似的问题,此文做以总结。


1、那么何为CPU的大端和小端呢?

大端: 指的是数据的高字节存放在内存的低地址中,数据的低字节存放在内存的高地址中;
小端: 指的是数据的高字节存放在内存的高地址中,数据的低字节存放在内存的低地址中;


2、如何用图来说明?

例如,有一个int类型变量,int a = 1,在32位系统上面,int占用4个字节,所以将其转换为二进制和十六进制显示分别为:

二进制: 00000000 00000000 00000000 00000001

十六进制: 0x0000000000000001

我们取a的地址为:&a = 0x003EF980;

在内存中的分布如下图: 


             


如上图所示:
(1)、数据的低字节0x01存放在了内存的高地址0x003EF983上面,则此时是以大端形式在存储数据;
(2)、数据的低地址0x01存放在了内存的低地址0x003EF980上面,则此时是以小端形式在存储数据。


3、如何用程序来判断当前主机是用什么方式存储数据的?


    用程序来判断的话,主要有两种方式来判断:

(1)、指针法

#include <stdio.h>

int main(void)
{
	int a = 1;
	char *p = (char *)&a;
	if (*p == 1)
	{
		printf("小端\n");
	}
	else {
		printf("大端\n");
	}

	getchar();
	return 0;
}

运行结果为:   



(2)、联合法

#include <stdio.h>

int main(void)
{
	union {
		short a;
		char b[sizeof(short)];
	}Test;

	Test.a = 0x0102;
	if (Test.b[0] == 1)
	{
		printf("大端\n");
	}
	else
	{
		printf("小端\n");
	}

	getchar();
	return 0;
}

运行结果为:   




————————————华丽的风格线————————————————

QQ群:西安C/C++开发者,诚邀您的加入










【软件测试】人工智能(AI)在软件测试领域的应用 AI在软件测试领域的应用使测试过程更加自动化、高效和智能。它可以帮助测试团队减轻负担,更快地识别和修复问题,最终提高软件的质量和可靠性。随着AI技术的不断进步,未来AI在软件测试领域的应用将更加广泛和深入。 阅读详情

相关推荐

Oracle EBS财务模块(三)总账功能

(一)总账管理系统主要功能  总账管理系统(Oraclegeneralledger)是一个公司一切账务系统的核心,它好比是公司会计信息的中央处理器。总账管理系统提供了一个完整的财务管理核算及分析流程。它是所有子账户的信息存储器,因此反映了所有子账户的财务和现金活动。总账管理系统的主要作用是记录公司的财务活动,并生成财务报表和管理报表,以帮助公司内外人士进行决策。一个公司或组织的制造系统、项目管理系

苏南生的优快云博客 2万+

【C语言】数据存储中大小端介绍,判断大小端(实例分析)

大端小端是一种数据存储模式,我们都知道地址吧,内存中地址由低到高递增 大端(存储)模式,是指数据的低位,保存在内存的高地址中,而数据的高位,保存在内存的低地址中。小端(存储)模式,是指数据的低位,保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

tq411810317的博客 4239

常规波束形成——时域波束形成、频域波束形成

本文介绍了波束成形,包括时域波束成形和频域波束成形,并解释了在实现过程可能存在疑惑的相位补偿。

Candy_Editor的博客 3659

C语言基础 —大端和小端

大端和小端

98同学吖的博客 5040

PayPal支付集成完全指南:开源库实践

本文介绍了如何从零开始集成PayPal支付功能。首先概述了PayPal提供的多语言SDK和开源库,包括PHP、Python、Node.js等版本。然后详细说明了准备工作,包括注册开发者账号、获取API凭证和使用沙盒环境测试。文章以Node.js为例,演示了安装SDK、基础配置和实现支付流程的完整代码,包括创建订单和捕获支付两个核心功能。最后提及了订阅支付等高级功能,为开发者提供了完整的支付集成方案。通过清晰的代码示例和步骤说明,帮助开发者快速实现PayPal支付功能集成。

2501_93501927的博客 1258

Ardupilot EKF3核心算法《开篇》

Ardupilot EKF3核心算法本专栏重点,透彻,详细的分析了ardupilot的EKF3,保证是你看到的最完美的EKF3资料,相信你的选择不会错误。网上EKF资料真是太多,说真的没有一篇讲解好的。!!

陌城烟雨 1413

c语言的大小端问题

大小端

赵凯月的博客 647

地球引擎初级教程:Python API 的安装和介绍

地球引擎的 Python API 提供了许多功能和工具,用于访问和处理地理空间数据。连接到地球引擎在编写地球引擎的 Python 脚本时,首先需要连接到地球引擎服务器。import ee # 初始化地球引擎 ee . Initialize()这将初始化地球引擎并建立与服务器的连接。加载和显示图像使用地球引擎的 Python API,您可以加载和显示卫星图像。import ee# 初始化地球引擎# 加载 Landsat 8 影像# 显示影像print('影像 URL:', url)

UePostscript的博客 1007

C语言:大小端模式、判断大小端、大小端转换

对于一个存储空间大于 1 个字节的数据,在内存中有两种存储模式, 大端模式 (big-endian):数据的高字节在内存的低地址存放,数据的低字节在内存的高地址存放 小端模式 (little-endian):数据的高字节在内存的高地址存放,数据的低字节在内存的低地址存放。判断主机字节序 (主机大小端),可以用联合体(union),指针,强制转换成 char 类型等方法。用位操作进行大小端转换,在网络编程中,也可以使用 htonl, htons, ntohl, ntohs 等函数。

天道酬勤 2万+

激光打标轴坐标计算分析

‌:基于坐标差的平方和开方运算,勾股定理将几何关系转化为代数计算,从而实现了从坐标到距离的精确转换‌12。直角三角形的应用从上图可以看到A,B,P三个点连起来就是一个直角三角形了。用勾股定理计算距离 C#有相关的方法直接传参数就可以了。很方便。

StevenChen的博客 311

星敏感器:卫星姿态测量的“星空导航仪”

在卫星、航天器和深空探测器的姿态控制系统中,星敏感器(Star Tracker) 是最精确的姿态测量设备之一。它通过识别恒星的位置,计算出航天器在惯性空间中的三轴姿态,精度可达 角秒级(arcsecond),是许多高精度任务(如遥感、天文观测、深空探测)的核心传感器。

ScilogyHunter的博客 3695

C语言笔记归纳17:数据的存储

大端字节序:“高位字节”(钥匙的前半部分)插在 “低地址钥匙孔”,“低位字节”(钥匙的后半部分)插在 “高地址钥匙孔”;(低地址→高地址);小端字节序:“低位字节”(钥匙的后半部分)插在 “低地址钥匙孔”,“高位字节”(钥匙的前半部分)插在 “高地址钥匙孔”;(低地址→高地址);常用场景:x86 架构(PC、多数嵌入式开发板)为小端,C51 单片机、网络传输(TCP/IP)为大端。整数存储:内存存补码,正整数三码合一,负整数补码 = 反码 + 1;大小端。

yonakaame的博客 1428

国科大学习资料--高级软件工程-复习题选择题答案

国科大学习资料–高级软件工程(罗铁坚 魏峻 刘丹)-复习题选择题答案 ’‘

无名何许人的博客 1165

【C语言】内存函数与数据在内存中的存储

函数功能特点适用场景memcpy复制内存不处理重叠内存,效率较高非重叠内存的复制memmove复制内存处理重叠内存,安全性高可能重叠的内存复制memset设置内存值按字节操作,用于初始化或填充内存初始化、批量设置值memcmp比较内存按字节比较,返回差值关系任意类型内存的比较符号位:最高位为符号位,0表示正数,1表示负数。数值位:剩余位表示数值大小。正整数:原码、反码、补码完全相同。int a = 5(32位)负整数原码:直接翻译二进制(符号位为1)。

记录了从0学习Java技术栈的日常 1666

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C语言结构体与共用体的深度解析及实战应用

本文深入解析了C语言中结构体与共用体的核心概念与应用。重点内容包括:结构体的定义语法与内存对齐规则,通过调整成员顺序可优化内存占用;结构体变量的三种定义方式及初始化方法;结构体指针的使用技巧,推荐使用箭头运算符访问成员;动态结构体指针的内存管理;结构体嵌套和数组的实际应用。文章通过丰富代码示例演示了结构体在实际开发中的灵活运用,为掌握复杂数据结构奠定基础。

今天比昨天更努力一点! 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C语言指针全面解析:从基础概念到底层存储

本文系统介绍了C语言指针的核心概念与使用方法。主要内容包括:指针的定义与初始化方法,强调避免野指针问题;指针算术运算规则及其与数组的配合使用;大小端存储模式对多字节数据的影响;指针的核心特性与运算符(&和*)的具体应用;以及指针使用的最佳实践建议,如初始化检查、边界控制等。文章详细阐述了指针直接操作内存地址的能力,解释了指针类型对数据解释的影响,并提供了指针运算和数组遍历的实用示例,帮助开发者安全高效地使用指针功能。

YangXY66的博客 803

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C语言深度剖析理解

本文全面总结了C语言中数组、指针和地址运算的关键知识点,主要包括: 基本概念对照表:详细区分数组声明、数组名、取地址等不同用法的类型和大小差异 sizeof运算规则:数组名单独使用时不退化,参与运算时退化为指针 地址运算关键区别:不同类型指针加减时的步长差异(如arr+1与&arr+1) 数组退化的三种场景:作为函数参数、参与运算和赋值时 二维数组的特殊处理:行指针与元素指针的区分 指针运算核心公式:p+n的地址计算方法 实用记忆卡片:归纳常见操作的规则和结果 黄金法则总结:退化规则、类型决定步长等

ch3nyuyu的博客 422

C语言内存存储解析:从整数到浮点数的二进制世界

上创建测试项目时,可以实时查看变量内存分布,这种可视化学习方式比单纯阅读理论更高效。平台无需配置环境的特点,特别适合快速验证各种内存存储猜想,比如测试不同编译器的大小端实现差异。理解内存存储原理对调试程序、处理二进制数据至关重要。推荐使用内存查看工具直接观察变量存储状态,比单纯理论分析更直观。

MoonstoneTiger89的博客 296

C语言联合体黑科技:快速实现float到4字节的无损转换(附完整代码)

快速实现浮点数与字节的无损转换,详解C语言联合体实现浮点数与字节转换的方法,适用于嵌入式通信、数据序列化等场景。通过共用内存布局高效解析float底层字节,无需类型转换函数,提升处理速度。代码简洁可靠,值得收藏。

Instrustar的博客 804

数据类型c语言自带的一些数据类型

c语言自带的一些数据类型long在不同环境中字节大小不同(比如VS中是4byte)

uL5leC35I的博客 251

C 语言核心知识点解析:字符串、内存与字节序

字符串函数strcpy、strcat的实现需关注'\0'结尾和内存溢出问题;memcpy适用于非重叠内存拷贝,memmove通过正向 / 反向拷贝处理内存重叠;字节序是多字节数据的存储顺序,可通过字符指针访问低地址字节判断系统字节序;无符号类型运算会发生循环溢出,strlen以'\0'为字符串结束标志。掌握这些知识点,能帮助我们更高效地编写 C 语言代码,规避常见的内存错误和数据计算问题。

APTX_4869_29的博客 694

【C 语言核心】数据存储

整形存储核心:所有整数以补码形式存储,有符号数靠符号位区分正负,无符号数只有数值位浮点存储核心:遵循 IEEE 754 标准,以「符号位 + 指数位 + 尾数位」编码,指数需加偏移量存储注意:注意类型转换的隐式规则,无符号数的运算陷阱,格式控制符的输出逻辑。

2401_88450623的博客 365

详解C语言—自定义类型(结构体、枚举、联合)

介绍C语言中自定义类型的相关用法

Han同学 568

【通信心法】把 struct 强转成指针发出去是原罪!撕碎内存对齐与大小端陷阱,用 NanoPB 构筑跨平台的绝对序列化契约

真正的顶级系统架构,必须将内存的数据结构与总线上的传输格式彻底剥离。我们需要引入 Google 的NanoPB。平庸的开发者,把内存里的 0 和 1 视作理所当然,随意地把指针扔来扔去。当系统在异构的夹缝中崩溃时,他们只能在黑暗中盲目地抓取 Bug。而顶级的系统架构师,对每一滴跨越系统边界的比特流都怀揣着绝对的敬畏。我们深知,C 语言的结构体只是编译器在特定架构下的一场“本地狂欢”。

Max_uuc的博客 403

maixcam,人脸识别、串口数据协议

串口通信协议设计与实现 摘要 本文详细介绍了嵌入式系统中串口通信协议的设计与实现方法,主要内容包括: 协议设计必要性 串口通信的"流式"特性导致数据边界模糊,需引入协议解决粘包问题 对比字符协议(ASCII)和字节协议(Binary)的优劣,推荐工业级二进制协议 核心技术要点 大小端(Endianness)问题解析及解决方案 Python struct模块的pack/unpack方法详解 校验和计算方法及防溢出处理 协议实现 设计帧结构:帧头(0xAA)+长度(2B)+数据域+校验和(1

The_superstar6的博客 949

【2个月 C 语言从入门到精通:零基础系统教程】第十三讲:数据在内存中的存储

本文深入解析C/C++中数据在内存的存储机制,重点探讨整数补码、大小端字节序和浮点数IEEE 754标准。主要内容包括:1) 整数存储采用补码形式实现统一运算;2) 大端模式(高位低址)与小端模式(低位低址)的区别及判断方法;3) 整型提升规则对类型转换的影响;4) 通过典型代码案例揭示数据存储的底层原理,如char类型在不同符号性下的整型提升差异。通过系统分析,帮助开发者深入理解内存数据表示,编写更健壮的底层代码。

专注计算机考研408,C语言入门,C++学习,分享学习笔记,代码实践,和大家一起进步 2660
上一篇: UNIX环境高级编程学习之路(六)----进程控制
下一篇: windows下编写Dll动态库及调用
drlmemory
博客等级 码龄14年 15粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值