数据的存储方式——大小端序

news2024/11/17 16:16:23

        大小端存储的故事源自于《格列佛游记》(Gulliver's Travels),这是爱尔兰作家乔纳森·斯威夫特(Jonathan Swift)于1726年所著的一部讽刺小说。在其中,主人公格列佛(Lemuel Gulliver)游历到一个名为 "利里普特"(Lilliput)的岛屿。在 "利里普特" 岛上,有两个派别:大端族和小端族,他们之间发生了长期的争斗。这两个派别之间的分歧源于如何打开鸡蛋的方式:大端族主张从大头砸开蛋壳,小端族则主张从小头砸开蛋壳。

        在计算机中,数据的存储方式通常分为大端序(Big-Endian)和小端序(Little-Endian)两种方式。这两种方式涉及到多字节数据在内存中的存储顺序。

  • 大端序(Big-Endian):在大端序中,数据的高位字节存储在低地址内存中,而低位字节存储在高地址内存中。因此,多字节数据的最高有效字节存储在最低内存地址处。这种方式类似于将数字从左到右排列。

  • 小端序(Little-Endian):在小端序中,数据的低位字节存储在低地址内存中,而高位字节存储在高地址内存中。因此,多字节数据的最低有效字节存储在最低内存地址处。这种方式类似于将数字从右到左排列。

举例来说,对于十六进制数 0x12345678:

  • 在大端序中,它会以字节为单位按照内存地址从低到高依次存储,即 12 34 56 78。

  • 在小端序中,它会以字节为单位按照内存地址从低到高反向存储,即 78 56 34 12。

        以下是在我Intel i7 x64 vs2019中显示内存中的结果,高位字节在内存地址高位,低位位字节在内存地址低位。

        在实际应用中,不同的处理器架构和操作系统可能采用不同的字节序,因此在进行数据交换或跨系统通信时,需要注意字节序的转换以确保数据的正确传输和解释。

我们可以用以下程序测试你的系统数据存储采取的哪种方式。 

#include <stdio.h>
 ​
 int check_endianness() {
     unsigned int num = 1;
     char *ptr = (char *)&num;
 ​
     // 如果系统是小端序,则第一个字节应该是1(最低有效字节)
     if (*ptr == 1) {
         return 0; // 小端序
     } else {
         return 1; // 大端序
     }
 }
 ​
 int main() {
     if (check_endianness() == 1) {
         printf("系统是大端序存储数据。\n");
     } else {
         printf("系统是小端序存储数据。\n");
     }
 ​
     return 0;
 }

在上面的程序中,将整数 1 强制转换为 char 指针的原因如下:

  1. 字节访问:char 类型是一个字节大小的数据类型,在 C 语言中通常用来表示字节。强制将整数指针转换为 char 指针后,可以按字节访问内存,以便检查系统存储的第一个字节。

  2. 绕过对齐要求:强制类型转换为 char 指针可以绕过内存对齐的要求。这一点对于需要直接访问内存的操作很有用,并且有助于确保我们可以准确地读取每个字节的值。

  3. 便于解释和比较:将整数强制转换为 char 指针后,可以更容易地解释和比较存储在不同字节中的数据。因为我们感兴趣的是内存中的单个字节,而不是整个整数。

        程序中使用 char 指针的主要目的是为了以字节为单位访问内存,并且能够更直观地获取每个字节的值,从而帮助我们确定系统是以大端序还是小端序存储数据。

关于字节对齐

        字节对齐(Byte Alignment)是指计算机系统中数据在内存中存储时按照特定的规则对齐到内存地址的过程。这个规则要求不同类型的数据在内存中被放置在特定地址上,以便系统能够高效地访问这些数据。在大多数计算机体系结构中,数据类型在内存中的起始位置是按照其自身大小的整数倍进行对齐的。通常情况下,基本数据类型如 char(1 字节)、short(2 字节)、int(4 字节)、long(4 或 8 字节)等会被对齐到它们自身所占用的字节数的倍数的地址上。例如,在一个要求以 4 字节对齐的系统中,int 类型变量将会被放置在内存地址为 0、4、8、12 等等的位置上。

字节对齐的原因主要有以下几点:

  1. 提高访问速度:对齐数据可以使处理器更有效地从内存中读取数据,因为处理器通常会更快地访问对齐地址的数据。

  2. 硬件要求:某些处理器甚至要求数据是对齐的,否则可能会导致错误或性能下降。

  3. 结构体对齐:结构体的对齐方式通常会受到其中包含的各个成员变量对齐方式的影响,以保证整个结构体中每个成员都被正确对齐。

        虽然字节对齐是有利的,但也可能会导致内存空间的浪费。编译器通常会根据所使用的编译选项和平台对数据进行默认的对齐,同时还允许开发者通过指定对齐方式来优化数据布局。

快去测试一下你的机器是什么端!

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

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

相关文章

[leetcode hot 150]第一百一十七题,填充每个节点的下一个右侧节点

题目&#xff1a; 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。 初始状态下&#x…

测试环境:使用OpenSSL生成证书并配置Https

文章目录 需求1、安装OpenSSL1.1、安装包下载1.2、安装&#xff08;以window 64位为例&#xff09;1.3、配置环境变量&#xff08;非必须&#xff09; 2、生成证书2.1、新建文件夹2.2、生成根证书2.2.1、生成私钥2.2.2、生成根证书&#xff0c;并且自签名 2.3、服务端证书生成2…

2-4 Softmax 回归的从零开始实现

就像我们从零开始实现线性回归一样&#xff0c; 我们认为softmax回归也是重要的基础&#xff0c;因此应该知道实现softmax回归的细节。 本节我们将使用刚刚在2-3节中引入的Fashion-MNIST数据集&#xff0c; 并设置数据迭代器的批量大小为256。 import torch from IPython impo…

Python 编程高手必会的10个单行代码:一招鲜,吃遍天

大家好&#xff0c;在Python编程中&#xff0c;我们时常需要高效、简洁的代码来解决复杂的问题。今天&#xff0c;我将向大家介绍10个非常有用的Python单行代码。 一行代码指的是将复杂的任务浓缩在一行代码中完成。它充分利用Python的简洁和强大&#xff0c;使代码更简洁、更…

k8s record 20240703

1. containerd 它不用于直接和开发人员互动&#xff0c;在这方面不和docker竞争 containerd的用时最短&#xff0c;性能最好。 containerd 是容器的生命周期管理&#xff0c;容器的网络管理等等&#xff0c;真正让容器运行需要runC containerd 是一个独立的容器运行时&am…

金丝键合强度测试仪试验条件要求:键合拉脱/引线拉力/剪切力等

金丝键合强度测试仪是测量引线键合强度&#xff0c;评估键合强度分布或测定键合强度是否符合有关的订购文件的要求。键合强度试验机可应用于采用低温焊、热压焊、超声焊或有关技术键合的、具有内引线的器件封装内部的引线-芯片键合、引线-基板键合或内引线一封装引线键合&#…

【Unity数据交互】二进制私

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

迭代加深——AcWing 170. 加成序列

迭代加深 定义 迭代加深搜索&#xff08;Iterative Deepening Depth-First Search, IDS&#xff09;是一种结合了深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;特点的算法。它通过限制搜索树的深度来控制搜索范围&#xff0c;起初以较小…

【C++】开源:nlohmann/json数据解析库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍nlohmann/json数据解析库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&am…

XAML 框架横向对比

多年来&#xff0c;基于 XAML 的 UI 框架有了很大的发展。下面的图表很好地证明了这个观点。XAML UI 框架的三大巨头&#xff1a;Avalonia UI、Uno Platform 和 .NET MAUI 都支持跨平台的应用。事实上&#xff0c;除了 Avalonia UI&#xff0c;对跨平台 XAML 的需求是它们发展的…

FPGA开发笔试1

1. 流程简介 我是两天前有FPGA公司的HR来问我实习的事情&#xff0c;她当时问我距离能不能接受&#xff0c;不过确实距离有点远&#xff08;地铁通勤要将近一个半小时&#xff09;&#xff0c;然后她说给我约个时间&#xff0c;抽空做1个小时的题目&#xff08;线上做&#xf…

(数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

控制下属绝不是拍桌子、甩脸子、摆架子,一流领导都用这3招!

控制下属绝不是拍桌子、甩脸子、摆架子&#xff0c;一流领导都用这3招&#xff01; 第一招&#xff1a;规矩严 国有国法&#xff0c;家有家规&#xff0c;公司也不例外。 下属能不能和领导齐心&#xff0c;愿不愿意共同发力&#xff0c;全看管理者如何操控。 毫无疑问的是&a…

NSSCTF-Web题目24(RCE-空格绕过、过滤绕过)

目录 [MoeCTF 2021]babyRCE 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]funny_web 4、题目 5、知识点 6、思路 [MoeCTF 2021]babyRCE 1、题目 2、知识点 空格绕过、过滤绕过 3、思路 出现源码&#xff0c;进行代码审计 需要我们GET方式上传一个rce变量&#x…

程序员下班为什么不关电脑?难道在偷偷加班?!

不管是周围的程序员朋友还是网上的很多程序员朋友&#xff0c;在下班后都是习惯不关电脑的&#xff0c;关上显示器&#xff0c;拿上手机&#xff0c;快乐下班&#xff01; 那么&#xff0c;为什么程序员下班都不关电脑&#xff1f;难道他们在偷偷加班&#xff1f; 其实&#x…

从GREE格力看如何起全球商标名称!

有些主体需要走出去出口到国外&#xff0c;普推商标知产老杨看到在一些海外电商平台的出售产品&#xff0c;也会需要英文商标&#xff0c;有的会申请申请注册中英结合商标&#xff0c;在国外申请注册也是比较方便。 格力开始想用“GLEE”(快乐)这个词作为商标名称&#xff0c;但…

七人互助拼团模式:共创共赢的电商新篇章

在当今电商行业的繁荣浪潮中&#xff0c;七人互助拼团模式犹如一股清流&#xff0c;凭借其独特的激励机制与深厚的互助合作文化&#xff0c;赢得了消费者与商家的广泛赞誉。这一模式不仅重新定义了团购体验&#xff0c;更在无形中强化了社群间的联系与协作&#xff0c;共同绘制…

Nettyの参数优化简单RPC框架实现

本篇介绍Netty调优&#xff0c;在上篇聊天室的案例中进行改造&#xff0c;手写一个简单的RPC实现。 1、超时时间参数 CONNECT_TIMEOUT_MILLIS 是Netty的超时时间参数&#xff0c;属于客户端SocketChannel的参数&#xff0c;客户端连接时如果一定时间没有连接上&#xff0c;就会…

【数据结构】常见四类排序算法

1. 插入排序 1.1基本思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。实际中我们…

Windows Server 2016 搭建 网络负载平衡 服务

网络负载平衡功能的安装 添加角色 默认不动————功能 勾选上 < 网络负载平衡 > 在工具中————打开 < 网络负载平衡管理器 > 网络负载平衡群集创建 注意 : 提前 将两台 web 站点服务器 都安装好 < 网络负载平衡功能 > 右键 选择 ————新建群集 ——…