【C语言知识】数据在内存中的存储

news2025/1/13 17:26:36

文章目录

  • 一、数据类型介绍
  • 二、整型在内存中的存储
    • 2.1 原码、反码、补码
      • 计算方法:
    • 2.2 大小端介绍
  • 三、浮点数在内存中的存储
    • 3.1 浮点数存储规则:
    • 3.2 对于M和E的特别规定:
  • 写在最后

深度剖析数据在内存中的存储

一、数据类型介绍

//整型家族
char        //字符,占1字节
short       //短整型,占2字节
int         //整型,占4字节
long        //长整形,占4/8字节
long long   //更长的整型,占8字节

//浮点数家族
float       //单精度浮点数,占4字节
double      //双精度浮点数,占8字节

除了上面两个数据类型之外,还有以下三种数据类型:

  • 构造类型(也就是自定义类型)
    • 数组类型
    • 结构体类型struct
    • 枚举类型enum
    • 联合类型union
  • 指针类型
    • int*
    • char*
    • float*
    • void*
  • 空类型
    • void表示空类型,常用于返回类型、函数参数、指针(空指针)

二、整型在内存中的存储

2.1 原码、反码、补码

原码就是这个整型的32位二进制表示,其中第一位,也就是最左端的数字,是符号位,如果符号位是1,表示负数,如果符号位是0,则表示正数,剩下31位用来表示数字。
正数的原码反码补码是一致的,不需要额外的计算和转换,但是负数的反码和补码需要计算

计算方法:

反码:原码的符号位不变,剩下的数字按位取反
举例:-15的原码:
10000000000000000000000000011111
符号位不变,剩下的数字按位取反:
11111111111111111111111111100000

补码:反码+1即可
举例:-15的补码:
11111111111111111111111111100001
注意: 已知补码的情况下,想求原码,既可以按照逆序计算,减一后按位取反,也可以直接取反再加一,和原码转补码的计算方式一样,这两个数可以很神奇的通过这种计算方式相互转换

再次提醒:正数的原反补码相同,大小都是原码,不需要额外计算和转换

2.2 大小端介绍

在大端机器中,存储数据会将高位存放在低地址中,高位存放在高地址中,如图:
把0x11223344存入内存
image.png

而在小端机器中,则相反,将低位存放在低地址中,高位存放在高地址中,如图:
把0x11223344存入内存
image.png

注意:11是高位的数字,好比十进制的12345,个十百千万,万位的1是高位的数字。

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

浮点数,意思就是小数,在科学计数法中,由于可以乘以10的多少多少次方,所以小数点可以看成是浮动的,于是称之为浮点数。

3.1 浮点数存储规则:

根据IEEE754的标准规定,一个浮点数可以用SEM来表示:
S表示符号位
E表示指数
M表示数字的具体有效数值

其中,在单精度浮点数中,一共32位比特位,SEM的分布是这样的:
image.png
可以看到,S占1位,E占8位,M占23位。

而在双精度浮点数中,一共64位,SEM的分布则是S占1位,E占11位,M占52位,这里不再赘述。

3.2 对于M和E的特别规定:

对于M来说,由于在内存中存储的是二进制的小数,所以,1<=M<2,也就是说,M可以写成1.xxxxxxxxx,即第一位永远是1。
所以在实际存储的时候,第一位1不会存入内存中,而是在读取的时候直接在第一位添1。
这样一来,就可以省下一位来存放数据,对于32位的浮点数来说,本来只能存23位有效数字的M,现在就可以存24位了。

对于E来说,因为科学计数法中的指数是有负数的可能性的,所以为了表示负数,E在存储的时候,会加上一个中间数,而在读取的时候减掉中间数。在32位浮点数中,8位比特位的空间是255,这个中间数是127,而在64位浮点数中,11位比特位的空间是2047,中间数就是1023。

综上,在读取浮点数的时候,会先将E的值减去中间数(127或1023),让E变回真实值,然后把M的最前面添1。这样就可以读出浮点数了。

写在最后

如果本文对您有帮助,可不可以给我一个小小的点赞呀❤~您的支持是我最大的动力。

博主小白一枚,才疏学浅,难免有所纰漏,欢迎大家讨论和提出问题,博主一定第一时间改正。

谢谢观看嘿嘿嘿!(〃∀〃)ゞ

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

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

相关文章

区块链与加密技术在信息安全中的应用: 探索区块链、加密货币和分布式账本技术如何改善身份验证、数据保护和交易安全。

随着数字化时代的到来&#xff0c;信息安全变得日益重要。随之而来的是对于新颖技术的需求&#xff0c;这些技术能够保护我们的数据、身份和交易免受恶意行为的侵害。区块链、加密货币和分布式账本技术便是这样一些引人瞩目的创新&#xff0c;它们在信息安全领域展现出巨大潜力…

Linux笔试题(2)

27、按下( A ) 键能终止当前运行的命令 A. Ctrl-C B. Ctrl-F C. Ctrl-B D. Ctrl-D 28、下面哪个命令用来启动X Window ( C ) A. runx B. Startx C. startX D. xwin 29、用 “rm -i”,系统会提示什么来让你确认( B ) A.命令行的每个选项 B.是否真的删除 C.是否有写的权限 D…

2023-8-18 区间和

题目链接&#xff1a;区间和 #include <iostream> #include <vector> #include <algorithm>using namespace std;typedef pair<int, int> PII;const int N 300010;int n, m; int a[N], s[N]; vector<int> alls; vector<PII> add, query…

【Alibaba中间件技术系列】「RocketMQ技术专题」小白专区之领略一下RocketMQ基础之最!

应一些小伙伴们的私信&#xff0c;希望可以介绍一下RocketMQ的基础&#xff0c;那么我们现在就从0开始&#xff0c;进入RocketMQ的基础学习及概念介绍&#xff0c;为学习和使用RocketMQ打好基础&#xff01; RocketMQ是一款快速地、可靠地、分布式、容易使用的消息中间件&#…

c++ 友元 运算符重载详解

友元 c是面向对象的&#xff0c;目的之一&#xff1a;封装 封装&#xff1a; 优点之一&#xff0c;就是安全。 缺点&#xff1a;在某些特殊的场合&#xff0c;不是很方便。 华为与IBM 40亿的咨询故事 IBM需要对华为各级部门做深度咨询分析&#xff0c; 为了提高咨询效率&a…

opencv特征匹配

img3 cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags2) Brute-Force蛮力匹配 import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inline img1 cv2.imread(box.png, 0) img2 cv2.imread(box_in_scene.png, 0) def cv_show(name,img):…

容器和云原生(三):kubernetes搭建与使用

目录 单机K8S docker containerd image依赖 kubeadm初始化 验证 crictl工具 K8S核心组件 上文安装单机docker是很简单docker&#xff0c;但是生产环境需要多个主机&#xff0c;主机上启动多个docker容器&#xff0c;相同容器会绑定形成1个服务service&#xff0c;微服务…

新书上市----Pytest企业级应用实战 新书上市

【原文链接】新书上市----Pytest企业级应用实战 新书上市 《Pytest企业级应用实战》 京东购书链接 当当购书链接 天猫购书链接 作者简介 本书作者本硕毕业于哈尔滨工业大学&#xff0c;曾先后就职于中兴通讯和华为&#xff0c;现任职于中科南京软件技术研究院&#xff0c;…

职业学院物联网实训室建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…

Educational Codeforces Round 62 (Rated for Div. 2) C. Playlist

一开始肯定要排个序&#xff0c;b相同时t大的在前边&#xff0c;不同时b大的在前面。 然后想最多只能选k个的限制&#xff0c;可以这样想&#xff0c;每次用到的b只能用已选到的最小的值&#xff0c;那可以把每个b都枚举一遍&#xff0c;然后每一次选时长最长的&#xff0c;且…

YOLOv5复现过程出现的问题(关于图片后缀不统一如包含大写的JPG)

划分训练集测试集时&#xff0c;出现有些图片后缀名不统一的问题&#xff0c;在资源管理器看着是jpg&#xff0c;但是程序中读着的时候是大写的JPG&#xff0c;因此需要将JPG修改为jpg。 这里采用的方式使用cmd。 在相应文件夹目录下打开cmd&#xff0c;然后输入for /R %i in (…

2023-8-18 区间合并

题目链接&#xff1a;区间合并 #include <iostream> #include <vector> #include <algorithm>using namespace std;const int N 100010;typedef pair<int, int> PII; int n; vector<PII> segs;void merge(vector<PII> &segs) {vector…

【业务功能篇69】Springboot 树形菜单栏功能设计

业务场景: 系统的界面&#xff0c;前端设计的时候&#xff0c;一般会给一个菜单栏&#xff0c;顶部横向以及左侧纵向的导航栏菜单&#xff0c;这里后端返回菜单栏的时候&#xff0c;就涉及层级父子项的问题&#xff0c;所以返回数据的时候&#xff0c;我们需要按照树化形式返回…

【水文学法总结】河道内生态流量计算方法(含MATLAB实现代码)

生态流量&#xff08;Ecological Flow, EF&#xff09; 是指维持河道内生态环境所需要的水流流量。生态流量计算方法众多&#xff0c;主要分为水文学方法、栖息地模拟法、水力学方法、整体法等&#xff0c;各方法多用于计算维持河道生态平衡的最小生态流量&#xff08;Minimum …

容斥原理 博弈论(多种Nim游戏解法)

目录 容斥原理容斥原理的简介能被整除的数&#xff08;典型例题&#xff09;实现思路代码实现扩展&#xff1a;用DPS实现 博弈论博弈论中的相关性质博弈论的相关结论先手必败必胜的证明Nim游戏&#xff08;典型例题&#xff09;代码实现 台阶-Nim游戏&#xff08;典型例题&…

STM32/AT32 MCO管脚输出时钟配置

前言&#xff1a;最近在学以太网通讯&#xff0c;发现RMII接口配置的时钟管脚有MCU自己输出&#xff0c;想要看看是怎么输出的&#xff0c;对此进行记录 1、交接项目项目上使用的是PA8管脚来输出时钟50MHZ&#xff0c;提供给上面refclk。 先看手册 PA8的复用功能具备将MCU时钟…

控制方法笔记

基于模型的控制&#xff1a;LQR&#xff0c;模型建立如果不准确&#xff0c;会给控制带来不确定性。 运动学和动力学&#xff1f; 大货车很多参数不了解的话&#xff0c;有时候不如用运动学。所以说&#xff0c;建模不精准不如用运动学。 LQR 模型是状态空间线性的。目标函…

SpringBoot + Vue 微人事(十)

职位管理前后端接口对接 先把table中的数据展示出来&#xff0c;table里面的数据实际上是positions里面的数据&#xff0c;就是要给positions:[] 赋上值 可以在methods中定义一个initPosition方法 methods:{//定义一个初始化positions的方法initPositions(){//发送一个get请求…

GB28181设备接入侧如何对接外部编码后音视频数据并实现预览播放

技术背景 我们在对接GB28181设备接入模块的时候&#xff0c;遇到这样的技术诉求&#xff0c;好多开发者期望能提供编码后&#xff08;H.264/H.265、AAC/PCMA&#xff09;数据对接&#xff0c;确保外部采集设备&#xff0c;比如无人机类似回调过来的数据&#xff0c;直接通过模…

《Go 语言第一课》课程学习笔记(八)

基本数据类型 Go 原生支持的数值类型有哪些&#xff1f; Go 语言的类型大体可分为基本数据类型、复合数据类型和接口类型这三种。 其中&#xff0c;我们日常 Go 编码中使用最多的就是基本数据类型&#xff0c;而基本数据类型中使用占比最大的又是数值类型。 整型 Go 语言的…