【C语言】大小端字节序存储

news2024/9/24 23:31:58

引子

不知道你是否像我一样好奇过一个问题:为什么每当我们在调试查看内存窗口时,(以int类型为例)4个字节内容存储的顺序好像是倒着的。

比如下面这张图,十进制数2077转换为十六进制是0x81d,四个字节分别是:00 00 08 1d。

内存窗口里的展示就是十六进制形式的,下面的1d 08 00 00分别代表四个字节,但是为什么是存放成1d 08 00 00而非00 00 08 1d呢?

那么本文,就来为你解答这个疑问。

什么是大小端字节序?

现在我们假设有下面这个代码:

int a = 0x11223344;//十六进制数

那么,因为数据在内存中的存储以字节为单位,这个十六进制数的四个字节内放的应该就是11 22 33 44(因为1个十六进制位可以转换为4个二进制位,而8个二进制位也就是2个十六进制位刚好为一个字节),可能会有以下两种存放方式:

我们把上面这一种叫做大端字节序存储,下面的叫小端字节序存储。可以通俗地理解为,正着存的是大端,倒着存的是小端。

语言描述这两种存储方式就是:

位字节存放在地址处,位字节存放在地址处,叫端字节序存储;

位字节存放在地址处,位字节存放在地址处,叫端字节序存储。

为什么会有大小端字节序之分呢? 

因为在存储数据时,往往不是一个字节,如short是2个字节, int是4个字节,float是4个字节,而超过一个字节的内容在存储时,就有字节顺序的问题,哪个字节在前哪个字节在后呢?是先存高位字节、还是先存低位字节呢?

所以需要确定一个顺序,乱序的我们一般不采用,就剩下正着和反着两种主要的存储顺序。我们将正着的称为大端字节序存储,倒着的称为小端字节序存储,更具体地说就是上面所说:位字节存放在地址处,位字节存放在地址处,叫端字节序存储;位字节存放在地址处,位字节存放在地址处,叫端字节序存储。

可以记住的是,我们一般使用的x86结构为小端字节序存储。

写一个程序判断当前机器的字节序

那么我们现在能否写一个程序来判断当前机器的字节序呢?

这个问题需要我们对字节序的概念掌握,同时还需要我们对指针有一定了解:

假如我们现在int a=1;那么它的存储序列的十六进制形式就是00 00 00 01,如果当前机器是大端字节序,那么存储时就会是00 00 00 01,而如果是小端字节序,存储就会是01 00 00 00。只要我们拿出第一个字节的内容看看是1还是0,就能知道当前机器的字节序了,对吧。

那么现在问题转化成,我们怎么拿到第一个字节内容呢?

如果你想直接将int强制类型转化为char,(char)a,很抱歉这是不能达到预期的,为什么?因为无论存储方式是大端字节序还是小端字节序,(char)a都会拿到1,因为这种强转的实现逻辑是,取最低位的有效字节(因为char只有一个字节),因为这种逻辑能一定程度上保证强转后的准确性,否则拿0有点莫名其妙了。

那么我们应该怎么做呢?为了不拿有效数字,就拿第一个字节内容,我们可以通过地址的方式,只要我们是通过第一个字节的地址去拿这个存储内容,我们就能保证拿的是第一个字节内容。

所以问题变为怎样可以只拿一个字节的地址,现在你应该就能明白了,只要把&a,即变量a的地址强制类型转换为char*类型,我们在解引用时就会只访问一个字节内容而非4个字节(int类型)的内容了。

可能需要解释的代码就是return *(char*)&a这一句,因为我们要么拿到1要么拿到0,我们可以直接将其作为返回值,调用结果拿到1我们就输出 "当前机器是小端字节序存储",否则就输出"当前机器是大端字节序存储"。这样就行了,代码保证了简洁性。

那么,到此本文就结束了,祝阅读愉快^_^

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 11 HBuilder X的安装和环境搭建教程

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 HBuilder X是一个由DCloud推出的集成开发环境(IDE),主要用于构建基于HTML、CSS和JavaScript的跨平台应用程序,如微信小程序、App、H5等。它提供了丰富的功能…

【iOS】Block总结

文章目录 前言一、Block如何捕获外界变量1.捕获自动变量2.捕获静态局部变量3.全局、全局静态变量 二、__block修饰符三、Block的类型四、判断block存储在哪里五、Block的copy操作六、源码分析Block_copy()七、__block 与 __forwarding八、block发生copy的时机总结 前言 之前的…

鹏哥C语言复习——程序的编译、链接和预处理

目录 可执行程序的生成: 预处理(预编译): 预定义符号: #define(重难点): 第一种的讲解(定义常量): 第二种的讲解(定义宏&#x…

怎么添加微信留言板功能

在这个信息爆炸的时代,如何让自己的微信公众号或朋友圈内容脱颖而出,成为每位内容创作者思考的问题。今天,我将为您揭示一种新颖且实用的功能——微信留言板,并带您探讨如何通过巧妙设置,将其打造成独一无二的主题&…

RuntimeError: CUDA out of memory. Tried to allocate 1.77 GiB?如何解决

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

JavaWeb-JS

目录 学习重点 什么是 JavaScript? Web标准 JS的引入方式 JS的基本语法 JS的函数 JS的对象 JS事件监听 学习重点 js 引入方式 js 基础语法 js 函数 js 对象 js 事件监听 什么是 JavaScript? Web标准 Web 标准也称为网页标准 ,由一系列的标准组成&#xff0…

Spring - Spring Cache 缓存注解这样用,实在是太香了!

作者最近在开发公司项目时使用到 Redis 缓存,并在翻看前人代码时,看到了一种关于 Cacheable 注解的自定义缓存有效期的解决方案,感觉比较实用,因此作者自己拓展完善了一番后分享给各位。 Spring 缓存常规配置 Spring Cache 框架给…

GpuMall智算云:AUTOMATIC1111/stable-diffusion-webui/stable-diffusion-webui-v1.8.0

配置环境介绍 目前平台集成了 Stable Diffusion WebUI 的官方镜像,该镜像中整合如下资源: GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Stable Diffusion WebUI版本:v1.8.0 Python版本:3.10.…

运维专题.Docker功能权限(Capabilities)管理和查看

运维专题 Docker功能权限(Capabilities) - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:htt…

Python深度学习基于Tensorflow(12)实战生成式模型

文章目录 Deep Dream风格迁移参考资料 Deep Dream DeepDream 是一项将神经网络学习模式予以可视化展现的实验。与孩子们观察云朵并尝试解释随机形状相类似,DeepDream 会过度解释并增强其在图像中看到的图案。 DeepDream为了说明CNN学习到的各特征的意义&#xff0c…

SQL使用函数给多个分表添加同一字段

数据库中分表时,往往需要向多个分表中添加同一个字段,可以定义一个函数,每次调用这个函数向多个份表中添加同意字段。 1、创建函数示例: 在PostgreSQL中创建一个简单的函数 以下是一个在PostgreSQL中创建函数的简单示例&#x…

PXE + Kickstart 无人值守装机

目录 一、简介 二、PXE工作流程 三、搭建 PXE 远程安装服务器 1.安装包准备 2.环境准备 3.搭建PXE远程安装服务器 (1)关闭 firewalld 和 selinux (2)配置双网卡 1)添加硬件网卡 2)编辑网卡配置文…

强化学习,第 2 部分:政策评估和改进

目录 一、介绍 二、关于此文章 三、求解贝尔曼方程 四、策略评估 4.1 更新变体 4.2 例描述 五、策略改进 5.1 V函数描述 5.2 政策改进定理 六、策略迭代 七、值迭代 7.1 算法描述 7.2 异步值迭代 八、广义策略迭代 九、结论 一、介绍 R强化学习是机器学习中的一…

一屏万象,场景无限:蓝牙墨水屏标签多功能多场景应用带您领略未来

在数字化浪潮汹涌澎湃的今天,智能科技产品层出不穷,它们不仅极大地改变了我们的生活方式,更在无形中拓宽了我们的视野。而今,一款融合了创新技术与实用性于一体的蓝牙墨水屏标签,正以其多功能多场景应用的特性&#xf…

【C++/STL】vector(常见接口、模拟实现、迭代器失效)

🌈个人主页:秦jh_-CSDN博客🔥 系列专栏: https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 目录 简单使用 常见接口 find insert vector模板 模拟实现 尾插 构造 迭代器失效 使用memcpy拷贝问…

Web漏洞:网络安全的隐形杀手

随着互联网的深入发展,Web应用程序已成为企业和个人生活中不可或缺的一部分。然而,随着Web应用的普及,网络安全问题也日益凸显,其中Web漏洞是网络安全领域面临的重大挑战之一。本文将详细探讨一些常见的Web漏洞及其潜在的危害&…

使用 Azure DevOps 和 Azure Web Apps 进行 .NET Core 应用的 CI/CD

概览 在现代软件开发中,快速部署和高效的版本控制系统是非常关键的。通过利用 Azure DevOps 和 Azure Web Apps,开发团队可以实现自动化的持续集成和持续部署(CI/CD),从而加快从开发到生产的过程。接下来我们一步步来…

深入探索MySQL SELECT查询:从基础到高级,解锁数据宝藏的密钥

系列文章目录 更新ing... MySQL操作全攻略:库、表、数据、事务全面指南深入探索MySQL SELECT查询:从基础到高级,解锁数据宝藏的密钥MySQL SELECT查询实战:练习题精选,提升你的数据库查询技能PyMySQL:连接P…

灯塔工厂产业数字化平台解决方案(50页PPT)

方案介绍: 随着工业4.0和智能制造的快速发展,传统工厂正面临着转型升级的迫切需求。为了提升生产效率、优化资源配置、增强市场竞争力,我们推出了灯塔工厂产业数字化平台解决方案。该方案旨在通过先进的信息技术手段,将传统工厂转…

感谢信∣高成长型动力电池供应商『华鼎国联』采购管理平台项目上线,企企通SRM加速新能源汽车发展新质生产力

近日,企企通收到来自华鼎国联四川动力电池有限公司(以下简称“华鼎国联”)的感谢信,对企企通团队在采购数字化项目实施中所付出的努力表示感谢。 华鼎国联在感谢信中特别指出,回首披荆斩棘的2023年,企企通的…