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

一、前言

  • 我们在刚开始学习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.rhkb.cn/news/283512.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手撕算法-接雨水

描述 分析 i位置能积累的雨水量,等于其左右两边最大高度的最小值。为了能获取i位置左右两边的最大高度。使用动态规划。两个dp数组: leftMaxrightMax 其中 leftMax[i] 代表i位置左边的最大高度rightMax[i] 代表i位置右边的最大高度 初始状态&#x…

Nacos源码流程图

1.Nacos1.x版本服务注册与发现源码 流程图地址:https://www.processon.com/view/link/634695eb260d7157a7bc6adb 2.Nacos2.x版本服务注册与发现源码 流程图地址:https://www.processon.com/view/link/634695fb260d7157a7bc6ae0 3.Nacos2.x版本GRPC…

Visual Studio 2013 - 高亮设置括号匹配 (方括号)

Visual Studio 2013 - 高亮设置括号匹配 [方括号] 1. 高亮设置 括号匹配 (方括号)References 1. 高亮设置 括号匹配 (方括号) 工具 -> 选项… -> 环境 -> 字体和颜色 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

React - 实现菜单栏滚动

简介 本文将会基于react实现滚动菜单栏功能。 技术实现 实现效果 点击菜单,内容区域会自动滚动到对应卡片。内容区域滑动,指定菜单栏会被选中。 ScrollMenu.js import {useRef, useState} from "react"; import ./ScrollMenu.css;export co…

网络原理(5)——IP协议(网络层)

目录 一、IP协议报头介绍 1、4位版本 2、4位首部长度 3、8位服务器类型 4、16位总长度 5、16位标识位 6、3位标志位 7、13位偏移量 8、8位生存空间 9、8位协议 10、16位首部检验和 11、32位源IP地址 12、32位目的IP地址 二、IP协议如何管理地址? 1、动…

python 空间距离计算

目录 python 空间距离计算 已知两点,画三角形 批量矩阵计算 python 空间距离计算 要在空间中找到一个点,使其位于点 b 和 c 之间的连线上,并且与点 b 的距离等于点 a 到点 b 的距离的2倍。 import numpy as npif __name__ __main__:a …

链路聚合的应用场景

STP:聚合后计算 物理端口的速率叠加 链路聚合、端口聚合,链路捆绑 把多根链路逻辑捆绑在一起,当STP进行拓扑计算时此时会按照聚合后链路计算链路聚合物理链路速率的叠加最多可以用8个链路同时捆绑 1.提升带宽 2.增加网络的高可用性&#…

【计算机网络】基本概念

基本概念 IP 地址端口号协议协议分层封装分用客户端服务器请求和响应两台主机之间的网络通信流程 IP 地址 概念:IP 地址主要是用于唯一标识网络主机、其他网络设备(如路由器)的网络地址。简单来说,IP地址用来唯一定位主机。格式&…

ky10.aarch64安装Jenkins

参考地址:《安装部署 Jenkins》 前言 有war包和rpm两种安装方式,如果是长期使用更加推荐rpm的安装方式,可以更好的管理Jenkins; 我此次安装jenkins主要用于测试和简单的个人使用,所以选择更轻便的war安装。 1 下载J…

校招应聘流程讲解

在整个应聘流程中,记得保持积极的态度、认真准备面试,同时也要对自己的能力和经验有清晰的认识,这样才能在竞争激烈的校园招聘中脱颖而出,成功获得心仪的工作机会. 1. 校招资源获取 想要参加校招,首先需要获取校招资…

Mac上玩《赛博朋克2077》mac电脑怎么玩这个游戏

X用户crushovitz_b最近发现,在《赛博朋克2077》游戏主菜单页面,将鼠标停在版本号选项卡上面足够长时间,就会发现游戏当前的版本号由2.12变为了2.0.77,这是对游戏标题2077的致敬彩蛋。 《赛博朋克2077》的叙事总监兼续集副总监Pawe…

【漏洞复现】科立讯通信指挥调度平台editemedia.php sql注入漏洞

漏洞描述 在20240318之前的福建科立讯通信指挥调度平台中发现了一个漏洞。该漏洞被归类为关键级别,影响文件/api/client/editemedia.php的未知部分。通过操纵参数number/enterprise_uuid可导致SQL注入。攻击可能会远程发起。 免责声明 技术文章仅供参考,任何个人和组织使…

吴恩达机器学习笔记 二十七 决策树中连续值特征的选择 回归树

还是猫狗分类的案例&#xff0c;假如再增加一个特征weight&#xff0c;该值是一个连续的值&#xff0c;如何在决策树中使用该特征&#xff1f; 如下图所示&#xff0c;尝试不同的阈值&#xff0c;如 weight<9 , 此时左边有四个样本&#xff0c;都为猫&#xff0c;右边有六个…

【c++入门】引用,内联函数,auto

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本节我们来到c中一个重要的部分&#xff1a;引用 目录 1.引用的基本概念与用法1.1引用特性1.2使用场景1.3传值、传引用效率比较1.4引用做返回值1.5引用和指针的对…

企业微信可以更换公司主体吗?

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…

搭建基于 Snowflake 的 CI/CD 最佳实践!

Snowflake 提供了可扩展的计算和存储资源&#xff0c;和基于 SQL 的界面 Snowsight&#xff0c;方便用户进行数据操作和分析。然而&#xff0c;如果用户想将自己的 CI/CD 流程与 Snowflake 集成时&#xff0c;会发现一些不便之处&#xff08;尤其相比其 SnowSight 优秀的查询能…

x-zse-96安卓端纯算,魔改AES还原

两天前发了一个x-zse-96的文章,当时遇到了点问题,只分析到了最后一个白盒AES函数里面,并且当时用dfa攻击还原出了秘钥,IV也确定了,但是加密结果不对,本来打算把下文鸽掉的,因为当时unidbg没跑起来,用frida去hook白盒AES中的每一行汇编有点麻烦,没有unidbg方便.后来小白大佬说un…

初识C++(一)

目录 一、什么是C 二、关键字&#xff1a; 三、命名空间 &#xff1a; 1. C语言存在的问题&#xff1a; 2. namespace关键字&#xff1a; 3. 注意点&#xff1a; 4.使用命名空间分为三种&#xff1a; 四、输入输出&#xff1a; 五、缺省函数&#xff1a; 1. 什么是缺省…

ARM实验 LED流水灯

.text .global _start _start: 使能GPIOE GPIOF的外设时钟 RCC_MP_AHB4ENSETR的第[4][5]设置为1即可使能GPIOE GPIOF时钟 LDR R0,0X50000A28 指定寄存器地址 LDR R1,[R0] 将寄存器原来的数值读取出来&#xff0c;保存到R1中 ORR R1,R1,#(0x3<<4) 将第4位设置为1 S…

【STM32嵌入式系统设计与开发】——6矩阵按键应用(4x4)

这里写目录标题 一、任务描述二、任务实施1、SingleKey工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;LED IO初始化函数(LED_Init())&#xff08;3&#xff09;开发板矩阵键盘IO初始化&#xff08;ExpKeyBordInit()&#xff09;&…