了解计算机的大小端存储模式

news2024/11/23 7:56:36

我们在计算机中存储数据时,数据是如何组织和表示的是一个重要的问题。其中一个关键概念是 大小端存储模式(Endianness),它描述了多字节数据在内存中的存储方式。本文将介绍大小端存储模式的原理、应用和区别。


什么是大小端存储模式?

大小端存储模式指的是 多字节数据在内存中的存储顺序。具体而言,其决定了一个多字节数据的高位字节和低位字节的存放顺序
在计算机中,最小的单位是字节(Byte),而多字节数据(如整数、浮点数等)需要由多个字节来表示。

  • 大端存储模式(Big Endian)高位字节存放在低地址,低位字节存放在高地址
  • 小端存储模式(Little Endian)高位字节存放在高地址,低位字节存放在低地址

为了更好地理解这个概念,我们以一个16位整数值 0x1234 为例来说明。

大端存储模式下,高位字节 0x11 存储在低地址,低位字节 0x22 存储在高地址(依次类推)。内存中的存储顺序如下:

在这里插入图片描述

而在小端存储模式下,高位字节 0x11 存储在高地址,低位字节 0x22 存储在低地址。内存中的存储顺序如下:

在这里插入图片描述

代码举例 在不同的大小端存储方式下,对同一整数进行存储和读取的结果不同:

int main() 
{
	// 代码可以判断 机器的大小端模式
    int x = 0x12345678;
    char *p = (char *)&x;
    printf("x = 0x%x\n", x);
    printf("p[0] = 0x%x, p[1] = 0x%x, p[2] = 0x%x, p[3] = 0x%x\n", p[0], p[1], p[2], p[3]);
    return 0;
}

在大端存储中,输出结果为:

x = 0x12345678
p[0] = 0x12, p[1] = 0x34, p[2] = 0x56, p[3] = 0x78

而在小端存储中,输出结果为:

x = 0x12345678
p[0] = 0x78, p[1] = 0x56, p[2] = 0x34, p[3] = 0x12

可以看到,在大端存储中,整数的高位字节存储在低地址,低位字节存储在高地址,而在小端存储中,情况则相反。 因此,在不同的大小端存储方式下,对同一整数进行存储和读取的结果不同。


大小端存储模式的应用(了解)

大小端存储模式在计算机系统中有广泛的应用。以下是一些常见的应用场景:


  1. 网络通信

在网络通信中,不同的计算机可能采用不同的存储模式。为了确保数据在网络上正确传输,通常需要进行字节序转换。发送方将数据从主机字节序(通常是本地字节序)转换为网络字节序(大端字节序),接收方再将数据从网络字节序转换回主机字节序。

  1. 文件格式

某些文件格式(如图像、音频、视频等)可能要求以特定的字节序存储数据。在读取或写入这些文件时,需要根据文件格式规范来处理字节序,以确保数据的正确解析和兼容性。

  1. 处理器架构

不同的处理器架构可能采用不同的存储模式。例如,x86 架构通常采用小端存储模式,而 PowerPC 和 ARM 架构通常采用大端存储模式。在开发跨平台应用程序时,需要注意处理字节序的差异,以确保程序在不同架构上的正确运行。


大小端 在应用上的区别(了解)

大小端存储模式在数据表示上存在一些区别。以下是一些常见的区别:

  • 字节访问 :大端存储下,直接访问一个多字节数据的任意字节时,需要进行地址计算;而小端存储下,直接访问最低有效字节的地址即可。
  • 网络传输 网络通信中常使用大端字节序,因此在进行网络数据传输时,需要进行字节序转换。
  • 指针操作 :由于指针是按照字节进行递增或递减的,因此在涉及指针操作的场景中,大小端存储模式可能会导致不同的结果。

大小端 例题

看下面一个有关联合体的题目:

判断下面程序的输出结果:(x86下,小端存储)

A) 3839     B) 3938    C) 380039     D)不确定
#include<stdio.h>
int main()
{
    union
    {
        short k;
        char i[2];
    }*s, a;
    s = &a;
    s->i[0] = 0x39;
    s->i[1] = 0x38;
    printf(%x\n”,a.k);
    return 0;
}

题目解释如下:

  1. 代码中定义了一个联合体类型union,包含一个short类型变量k和一个char类型数组i[2]联合体的成员共享同一块内存空间,即k和i[2]使用相同的内存位置。
  2. 通过s指针访问联合体的char数组 i[],并分别赋值为0x390x38
  3. 由于short和char共用两个字节,对i[]进行修改也会对k进行修改。
  4. 根据对数组元素的赋值,可以知道0x39为低地址,0x38为高地址,则打印出k为3839

总结

  1. 大小端存储模式描述了多字节数据在内存中的存储顺序。
  2. 大端存储模式将高位字节存放在低地址,小端存储模式将高位字节存放在高地址。
  3. 大小端存储模式在网络通信、文件格式和处理器架构等方面有广泛的应用。
  4. 了解大小端存储模式的原理和区别对于开发和调试计算机系统非常重要,尤其是在处理跨平台数据交互时。

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

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

相关文章

国外住宅IP代理选择的8个方法,稳定的海外IP哪个靠谱?

一、国外住宅IP代理是什么&#xff1f; 代理服务器充当您和互联网之间的网关。它是一个中间服务器&#xff0c;将最终用户与他们浏览的网站分开。如果您使用国外代理IP&#xff0c;互联网流量将通过国外代理服务器流向您请求的地址。然后&#xff0c;请求通过同一个代理服务器…

【独立开发】跨境电商商城源码!源码全开源,无加密,软著加持,交付源码!

大家好&#xff0c;今天要给大家带来一个重磅好消息! 一直在寻找优质跨境电商源码?那么这个你一定不能错过! 1、独立开发&#xff1a;这款源码是由我们团队独立开发&#xff0c;从需求分析、设计、编码到测试&#xff0c;全部由我们亲自完成。这里没有中间商&#xff0c;也没有…

小红书运营篇1,新手如何快速分析拆解对标账号

hi&#xff0c;同学们&#xff0c;本期是第1期AI运营技巧篇 很多新手博主初期都非常迷茫&#xff0c;主要是因为他们没有找对标账号&#xff0c;也没有充分分析同行账号。 有些人可能会说&#xff0c;“我不想参考同行&#xff0c;我想要追求创新”。这种勇气是真的非常值得鼓…

【Unity实战】最全面的库存系统(一)(附源码)

文章目录 先来看看最终效果前言定义物品定义人物背包物品插槽数据拾取物品物品堆叠绘制UI移动拖拽物品选中物品跟随鼠标移动背包物品交换物品拆分物品物品堆叠源码完结先来看看最终效果 前言 它又来了,库存系统我前面其实一句做过很多次了,但是这次的与以往的不太一样,这个…

浅谈电力物联网时代物联网技术在电力系统中的应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定201801 摘要&#xff1a;在电力系统建设中&#xff0c;物联网的应用不仅促进了我国电力工业的发展&#xff0c;而且对我国的物联网技术也起到了一定的促进作用。随着物联网技术应用于电力系统&#xff0c;推动了中国工业的快速发展。因…

Electron[3] 基础配置准备和Electron入门案例

1 背景 上一篇文章已经分享了&#xff0c;如何准备Electron的基础环境了。但是博客刚发才一天&#xff0c;就发现有人问问题了。经过实践发现&#xff0c;严格按照作者的博客教程走是不会有问题的&#xff0c;其中包括安装的环境版本等都要一致。因为昨天发的博客&#xff0c;…

【Java 进阶篇】JSP 指令详解

JavaServer Pages&#xff08;JSP&#xff09;是一种用于开发动态 Web 应用程序的强大技术。与传统的 Servlet 编程相比&#xff0c;JSP 更易于编写和维护。在 JSP 中&#xff0c;我们可以使用指令来定义页面的行为和属性。本博客将深入探讨 JSP 中的指令&#xff0c;从入门到精…

MacBook 上运行火影忍者,下载安装详细教程仅需简单三步

以前一直用 Mac 玩金铲铲或者原神&#xff0c;没想到前两天看到有个朋友居然在 Mac 上玩起了火影&#xff0c;哇&#xff0c;超帅的&#xff0c;今天跟大家分享一下如何在 mac 上安装运行火影&#xff0c;非常的丝滑~ 1、首先我们安装 playCover playCover 是我们在 Mac 上运…

高数笔记05:不定积分与定积分

图源&#xff1a;文心一言 时间比较紧张&#xff0c;仅导图~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图~&#x1f9e9;&#x1f9e9; 参考资料&#xff1a;《高等数学 基础篇》武忠祥 &#x1f433;目录 &#x1f433;目录 &#x1f433;不定积分 &#…

IDEA中配置Maven

一、Maven下载 首先我们进入maven官方网站,进入网页后,点击Download去下载 下载免安装版,解压即可,解压至磁盘任意目录,尽量不要取中文名如下图: 二、配置Maven环境变量 复制Maven所在的路径 D:\maven\apache-maven-3.6.3,此电脑右键选择属性->高级系统设置->环境…

交通网络分析之交通规则

目的 我们现实中的路网&#xff0c;不是所有道路都是双向通行的&#xff0c;会存在单向通行、禁止通行等情况&#xff0c;这种情况在交通分析中该如何处理&#xff1f; 这种应用场景在SuperMap iDesktopX中如何去处理呢&#xff0c;下面跟着我一起看看吧。 功能介绍 首先&#…

WARNING: tokenization mismatch: 403 vs. 406. (ignored) LLaVa

LLaVa换BaiChuan底座报错 WARNING: tokenization mismatch: 403 vs. 406. (ignored) 解决 cd ~/.cache/huggingface/hub/models--baichuan-inc--Baichuan2-7B-Base/snapshots/0cc6a61c06cd0734270151109d07cf86ef0ace53 vim tokenizer_config.json把bos_token改成true&#…

如何安装Wnmp并结合内网穿透实现外网访问内网Wnmp服务

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

论文润色 | GPT4.0论文润色指令总结(含GPT3.5和4.0润色效果对比)

半年前&#xff0c;那时候ChatGPT刚火热起来&#xff0c;我在知乎最先创建了一个提问:你在使用ChatGPT进行论文润色时的指令有哪些?。目前已经收到113个答案&#xff0c;浏览量超过110万。而这个问题下面我的回答也收到36万的阅读量&#xff0c;1.6万的收藏量&#xff0c;我想…

解决树莓派Oops -unable to determine board type ... model:17

1、载.deb文件&#xff0c;网址&#xff1a;https://project-downloads.drogon.net/wiringpi-latest.deb 2、将文件拷贝进树莓派系统的/tmp文件夹下 3、在该目录下运行linux命令&#xff0c;安装成功之后就可以看到相关信息了 sudo dpkg -i wiringpi-latest.deb

UE5——源码阅读——9——引擎预初始化

加载项目模块 判断项目是否是有意义的 准备读取模块 对应着错误信息 广播 加载插件模块 根据配置是否已经启用插件 开始遍历所有的插件 尝试读取插件 检查上一次完成的加载阶段是否大于当前的加载阶段 通知加载完成

39+又是一篇惊鸿巨作,教你如何打造高分SCI文章

今天给同学们分享一篇生信文章“The heterogeneous immune landscape between lung adenocarcinoma and squamous carcinoma revealed by single-cell RNA sequencing”&#xff0c;这篇文章发表在Signal Transduct Target Ther期刊上&#xff0c;影响因子为39.3。 结果解读&am…

排序算法的分析及实现

目录​​​​​​​ 1. 排序 1.1. 排序的概念 1.2. 排序的稳定性 1.3. 内部排序和外部排序 2. 直接插入排序 2.1. 直接插入排序 2.2. 直接插入排序的两种情况 1. 情况一 2. 情况二 2.3. 直接插入排序的单趟排序 2.4. 直接插入排序的完整实现 2.5. 直接插入排序的时…

gitlab 设置 分支只读

一&#xff0c;设置master分支只读&#xff0c; 并且只有Maintainers 拥有合并权限。 二&#xff0c;设置成员权限 改为developer 三&#xff0c;邀请成员 点击右上角 Invite Members

python判断出栈顺序是否合法_合适出栈序列

题目&#xff1a; 有一个含1~n的n个整数序列a&#xff0c;通过一个栈可以产生多种出栈序列&#xff0c;设计一个算法采用链栈判断序列b&#xff08;为1~n的某个排列&#xff09;是否为一个合适的出栈序列&#xff0c;并用相关数据进行测试。 解释&#xff1a; ①栈空&…