【C语言】数据在内存中的存储(包含大小端字节序问题)~

news2025/2/25 12:14:03

一、前言

  • 我们在刚开始学习C语言的时候,就接触到了很多数据的不同类型
  • 我们也知道,数据是存储在一块内存空间的,且我们只知道数据的类型决定着,该数据在内存中所占内存空间的大小,
  • 且超过一个字节的数据在内存中存储的时候,就有(以字节为单位)存储顺序的问题。
  • 可我们更应该知道,数据不仅仅只是存储到指定的空间就完事了,而是不同类型的数据有它相对应的存储原则的。
  • 这篇文章就是讲解不同类型的数据是在内容中的存储方式+大小端字节序
  • (本篇文章只对整型家族与浮点型家族对其在内存中的布局进行详解)待更~

二、整型数据在内存的存储

1.如何存储整型数据?
  • 整数的二进制表示形式有三种:原码(整数数据按照二进制的转换后,得到的就是原码)、反码、补码。
  • 而整数在内存中是以补码的形式存储的。
  • 这三种表示形式都有符号位与数值位,符号位用‘1’表示负,用‘0’表示正,而符号位是数值位的最高一位作为符号位
  • 若整数类型是无符号整型,则会把最高位也看成数值位,而把数据默认为正数。且它的反码与补码都等于原码
  • 当是有符号的整数时,整数为正时,原码、反码、补码相同。为负的时候,则需要按照下面的运算法则得到补码。
  • 原码(整数数据按照二进制的转换后,得到的就是原码);反码(原码,保持符号位不变,其余位按位取反(~)得到反码);补码(反码 + 1得到补码)。
  • 补:补码按照同样的运算法则,可以得到原码。
2.补码的意义是什么?
  • 补码可以让在内存中存储的整数数据,符号位与数值位统一处理。
  • CPU只有加法器,无论进行加法还是减法,两数补码直接相加即可
  • 原码转换为补码;补码转换原码,运算法则相同。(符号位不变,数值位按位取反,后+1)
3.如何读取整型数据?
  • 整型数据的读取较为简单,怎么存的怎么读出来就行
  • 首先,判断该数据类型是否是整型类型
  • 其次,判断该整数是signed的整型类型还是unsigned整型类型
  • 若为,若为signed的整型类型,且存的整数是负数,需紧记原反补的转换!!!

三、浮点型数据在内存中的存储

1.如何存储浮点型数据(伏笔)
  • (-1)^S  *  M  *  2^E  
  • 任何一个二进制的浮点型数据,都可以用上面的科学计数法表达式来表示;
  • S:用于决定该浮点型数据的正负号,S=0时,数据的正负性为正,S=1时,数据的正负性为负。
  • M:是一个>1 且 <2的有效数字(我们联想到十进制的科学计数法的有效数字也就能理解到这点)。
  • E:是一个指数
  • S M E在内存中的布局(下面的的讲解都将以float类型展开,也就是4字节的)
2.如何存储浮点型数据(开始)
  • 上面只是介绍了一些有关存储浮点型数据的相关的概念,可这些不足以让我们深入理解到浮点型到底在内存中是如何存储的。
  • 存储S数据:
  • 很简单,数据是正的,S位上就是0,反之,位1。
  • 存储M数据:
  • 因为我们都知道M都是一个>1 且 <2的有效数字;
  • 为了能让内存得到更高效的利用,在M中的数据存储到内存的时候,都会将M小数点前面的1省去,只保留小数部分。
  • 而等我们读取数据的时候,会将M的1再补上去,这样就更高效的利用了一个比特位。
  • 存储E数据:
  • E是一个无符号整型数据,可是浮点型数据是有正负性之分的,那如何去解决这一难题呢?
  • 我们在存储E的数据的时候会加上一个中间值,进行转换,存储到内存中。
  • 读取的时候,也会把得到的数据减去这个中间值。
  • 中间值是什么?
  • 用8比特位存储E数据的时候,其中间值是127(255/2)
  • 用11比特位存储E数据的时候,其中间值是1023(2047/2)
  • 这里我将举两个例子
3.如何读取浮点型数据(结尾)
  • 只要理解了如何存储浮点型数据,那读取数据就迎刃而解(怎么走的,就怎么回来),但是也有一些特殊的地方,比如对E数据的读取。
  • 存储E数据的比特位全为0的时候:(这是一个无限小的数字)
  • 这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字
  • 存储E数据的比特位全为1的时候:(这是一个无限大的数字)
  • 这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s);
  • E不全为0或不全为1
  • 怎么存E的数据,就怎么读取就行。

四、大小端字节序

1.概念的引出
2.大小端字节序的概念
  • 小端字节序存储:
  • 高位的数据存储的高地址处;低位的数据存储到低地址处
  • 大端字节序存储:
  • 高位的数据存储的低地址处;低位的数据存储到高地址处
3.如何判断当前机器的字节序是哪种类型
  • 不同平台的是大端字节序的存储,还是小端字节序存储是不一样的,我们能做的就是通过一定的手段获得机器是大端字节序存储,还是小端字节序存储。
  • 指针求解:
  • 联合体求解:

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

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

相关文章

【NLP笔记】Transformer

文章目录 基本架构EmbeddingEncoderself-attentionMulti-Attention残差连接LayerNorm DecoderMask&Cross Attention线性层&softmax损失函数 论文链接: Attention Is All You Need 参考文章: 【NLP】《Attention Is All You Need》的阅读笔记 一…

安科瑞智慧安全用电云平台【无人化数据监控 远程控制 运维管理】

背景 在住宅火灾中,电气引发的居高不下,已查明原因的火灾中有52%系电气原因引起,尤其是各类家用电器、电动车、电气线路等引发的火灾越来越突出,仅电动自行车引发的较大火灾就有7起。这些事故暴露出电器产品生产质量、流通销售&a…

引领展览新风尚:一站式搭建VR在线展馆,开启数字化展示新纪元

随着VR技术的不断成熟和普及,VR在线展馆已成为企业和用户展示展品的新颖方式。这种技术不仅能够提供沉浸式的观展体验,还能帮助企业和个人快速搭建属于自己的虚拟展馆。元居虚拟空间布展平台为用户提供了快速搭建VR在线展馆的便捷服务。 一、VR在线展馆的…

vue3+vite项目打包遇到的问题

一、项目打包出现空白页 vite.config.js中,添加base: ./ import { defineConfig } from vite import vue from vitejs/plugin-vueexport default defineConfig({base: ./, })router/index.js,将路由模式改成hash模式 import { createRouter, createWe…

4G/5G视频记录仪_联发科MTK6765平台智能记录仪方案

视频记录仪主板采用了联发科MT6765芯片,该芯片采用12nm FinFET制程工艺,8*Cortex-A53架构,搭载安卓11.0/13.0系统,主频最高达2.3GHz,待机功耗可低至5ma,并具有快速数据传输能力。配备了2.4英寸高清触摸显示…

YOLOv5独家改进:block改进 | RepViTBlock和C3进行结合实现二次创新 | CVPR2024清华RepViT

💡💡💡本文独家改进:CVPR2024 清华提出RepViT:轻量级新主干!从ViT角度重新审视移动CNN,RepViTBlock和C3进行结合实现二次创新 改进结构图如下: 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创…

2024:存量时代,内容平台如何“发新芽”?

今年年初,腾讯董事会主席马化腾表示,微信这棵老树如何发新芽,是一个很大的问题。 在互联网存量时代,如何提升效率焕发新活力,已经成为内容平台共同的命题。本质上看,这需要平台把握“三重法则”&#xff1…

【STM32+HAL】DMA应用

一、串口DMA收发 1、串口初始化 2、定义全局变量 #define RXBUFFERSIZE 256uint8_t rx_buffer[RXBUFFERSIZE];//接收数组 volatile uint8_t rx_len 0; //接收到的数据长度 volatile uint8_t recv_end_flag 0; //接收结束标志位 3、开启IDLE中断以及串口DMA接收 /* USER COD…

numpy的数组深度叠加dstack详解

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 numpy的dstack函数用于沿着第三个维度(深度)将数组堆叠起来。它将多个数组按照深度方向进行堆叠,生成一个新的数组。具体来说,dstack函数会将输入的…

【网络原理】HTTP协议和使用Fiddler抓包

文章目录 🍃HTTP协议是什么?🍀理解 "应用层协议"🎍HTTP 协议的工作过程🌴HTTP 协议格式🌳Fiddler抓包工具的使用🌸如何抓HTTPS的包? 🎋抓包工具的原理&#x1…

直观与交互:山海鲸可视化软件与Excel传统表格的对比

作为一名长期使用Excel进行数据处理和分析的用户,最近我尝试了一款名为山海鲸的可视化软件,发现它与Excel传统表格之间存在诸多明显的差异。接下来,我将从个人体验视角出发,谈谈这两种工具的不同之处。 首先,从数据呈…

HashMap设置初始容量为17,那么它的实际容量是多少?

典型回答 即使初始化 HashMap 的容量为 17,那么它的实际容量却是 32。 这是因为 HashMap 的容量只能为 2 的 N次方,这是 HashMap 的源代码中的实现,无论用户输入的是多少,它总会通过计算,得到第一个比他大的2的N 次方…

cc-uploadSomePic图片上传组件:快速开发与用户体验的提升

cc-uploadSomePic图片上传组件:快速开发与用户体验的提升 摘要: 在前端开发中,图片上传功能是一个常见的需求。为了提高开发效率和用户体验,我们开发了一个名为cc-uploadSomePic的图片上传组件。该组件支持单个或多个文件上传&am…

Linux下使用ntpdate进行时间同步

1.简介 ntpdate是Linux下用于从NTP服务器同步时间的命令行工具。 2.安装 大多数Linux发行版已预装ntpdate。未安装的可使用以下命令: # Ubuntu/Debian sudo apt-get install ntpdate # CentOS/Fedora/RHEL sudo yum install ntpdate 3.手工同步网络时间 执行以下命…

JavaScript中的继承方式详细解析

什么是继承 继承是面向对象编程中的一个重要概念,它指的是一个对象(或类)可以获得另一个对象(或类)的属性和方法。在继承中,被继承的对象通常称为父类(或基类、超类),继…

prince2和Pmp哪个含金量高?

一,认证情况 1、PMP(项目管理专业人士资格认证)是PMI( 美国项目管理协会 )最有影响力的证书,PMBOK( 项目管理知识体系指南 )是PMP的认证标准,是美国国家项目管理标准,PMI会员有70%集中在北美,PMP认证在北美地区很受欢…

基础乱炖来吧

1,SSH框架和SSM区别 SSH:structspringhibernate,SSM:MVCspringmybatis struct入口是filter级别,对action类进行请求,一个action类对应一个请求、类拦截;spring-mvcservlet级别,方法级别请求&…

【ESP32 IDF】ESPTIMER定时器

文章目录 前言一、ESPTIMER定时器的介绍1.1 定时器是什么1.2 ESPTIMER定时器的介绍 二、ESPTIMER的使用2.1 简单使用过程2.2 停止定时器2.3 删除定时器 三、示例代码总结 前言 在ESP32 IDF开发框架中,ESPTIMER是一个功能强大的定时器模块,用于实现定时任…

武汉星起航引领跨境电商风潮,五对一服务体系助力卖家飞跃成长

在全球贸易蓬勃发展的背景下,跨境电商行业迎来了前所未有的机遇与挑战。在这一领域中,武汉星起航电子商务有限公司以其专业的运营团队和优质的服务,成为众多跨境卖家的首选合作伙伴。 武汉星起航自2020年创立以来,始终致力于为跨…

前端项目ip做域名映射

1、在阿里云、腾讯云购买域名 SSL 证书和私钥生成 阿里云生成证书详解 /path/to/your/ssl_certificate1.crt和/path/to/your/ssl_certificate1.key 生成私钥(key): 使用 OpenSSL 工具生成一个私钥文件。执行以下命令: openss…