C语言——数据在内存中的存储【整型数据在内存中的储存,大小端字节序储存,浮点型数据在内存中的储存】

📝前言:
在前面的三篇文章中我们已经完成了对字符函数和字符串函数的学习,现在就让我们探索新领域,更加深入的理解**数据在内存中的存储方式**:
1,整数在内存中的存储
2,⼤⼩端字节序存储
3,浮点数在内存中的存储

🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:请记住,人生唯一确定的,就是不确定的人生

文章目录

  • 一,整数在内存中的存储
    • 1,为什么要以补码的形式储存呢?
    • 2,原码,反码,补码的区别
      • ①正数:
      • ②负数:
  • 二,大小端字节序存储
    • 1,⼤⼩端存储的区别
    • 2,为什么要有大小端存储之分?
  • 三,浮点型数据在内存中的储存
    • 1,二进制浮点数的另一种表示形式
    • 2,浮点数储存过程
      • 1)符号位S的储存
      • 2)有效数M的储存
      • 3)指数E的储存
    • 2,浮点数取的过程
      • 1)E不全为0或不全为1
      • 2)E全为0
      • 3)E全为1

一,整数在内存中的存储

对于整型数据来说:数据是以补码的形式存放在内存中

1,为什么要以补码的形式储存呢?

(简单来说)因为:
计算机的CPU只有加法器,但是在**二进制中,正数和负数的表示方法不同。如果我们想统一加法和减法的操作,就需要将所有的数(无论正负)都转换为一种表示方式**,【补码就是其中的一种表示方式。】
当都转化为补码这一种形式的时候,我们就可以统一加法和减法操作,从而简化了计算机的运算过程。

2,原码,反码,补码的区别

原码,反码,补码到底是什么?
其实原码,反码,补码只是数据的几种不同的表示方式
📑对于所有数据来说:数据二进制的表示方式就是它的原码

那不同数据的反码和补码呢?
我们把整型分成两大类:正数负数

①正数:

●正数的原码,反码,补码是相同的

例如(对于int 类型的数据5

原码:00000000000000000000000000000101
反码:00000000000000000000000000000101
补码:00000000000000000000000000000101

●无符号整型的反码补码原码也都是相同的(因为也都是正数)

②负数:

●原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
●反码:将原码的**符号位不变其他位按位取反**就可以得到反码。
●补码:反码+1就得到补码

例如(对于整型数据-5

原码:10000000000000000000000000000101
反码:11111111111111111111111111111010
补码:11111111111111111111111111111011

(如果要通过补码得到原码:也可以通过【将补码符号位不变,其他位按位取反;再+1的方式】)

所以对5-5而言:
5 在内存中, 就是以5的补码 : 00000000000000000000000000000101存放的
-5在内存中,就是以-5的补码:11111111111111111111111111111011存放的

二,大小端字节序存储

1,⼤⼩端存储的区别

●⼤端(存储)模式:将数据低位字节的内容保存在内存的⾼地址处,⽽数据⾼位字节的内容,保存
在内存的低地址处。
●⼩端(存储)模式:将数据低位字节的内容保存在内存的低地址处,⽽数据⾼位字节的内容,保存
在内存的⾼地址处。

其实就是看数据**低位字节的内容保存在哪里**
●保存在内存的高地址处,就是大端存储
●保存在内存的低地址处,就是小端存储

例如,对于0x11223344这个数据:
在这里插入图片描述
那么,我们来看看VS:
在这里插入图片描述

我们可以看到:
a的内容11223344被储存为了44332211
这就是因为博主的计算机中的VS是用小端模式来储存数据的

2,为什么要有大小端存储之分?

C语言中的大小端存储之分主要是为了解决不同计算机系统之间的通信和数据交换问题。由于不同的计算机系统可能有不同的字节序,因此需要一种统一的方式来表示和传输数据。C语言提供了大小端存储之分,使得在不同的计算机系统之间可以正确地解析和传输数据
总的来说,大小端存储之分是为了解决不同计算机系统之间的字节序问题,以保证数据的正确解析和传输。

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

开门见山:浮点数在内存中的储存与整数是不一样的!
整数是以补码的方式储存,那浮点数呢?

1,二进制浮点数的另一种表示形式

我们先来了解二进制浮点数的另一种表示形式👇🏻

根据国际标准IEEE🔍, 任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
(-1)^S * M * 2^E
• (−1)^S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M 表示有效数字,(1<=M<2)
• 2^E表示指数位。

比如👇🏻:
•⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2
【 S=0,M=1.01,E=2 】
•⼗进制的-5.0,写成⼆进制是 -101.0 ,相当于 - 1.01×2^2
【 S=1,M=1.01,E=2 】
•十进制的5.5,写成二进制是 101.1 ,相当于 1.011×2^2
【S=0,M=1.011,E=2】
(注意这里都是二进制,所以每一位上对应的权重的底数应该是2)
比如101.1:从左到右每位数依次对应的权重是:2^2, 2^1, 2^0, 2^(-1)

2,浮点数储存过程

我们可以发现,每个浮点数,都可以用S M E 三个数据来表示出来,因此我们在储存时,也只需储存好这三个数据就可以了

IEEE 754规定:
•对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
•对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
👇🏻
在这里插入图片描述

1)符号位S的储存

•正数储存0
•负数储存1

2)有效数M的储存

浮点数中的有效数一般写成 1.xxxxxx 的形式,其中 xxxxxx 表⽰⼩数部分。
如:浮点数5.51.011×2^2011是小数部分

🔍IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此会被舍去,只保存后⾯的xxxxxx部分。(因为1<=M<2,M总是1.xxxxxx 的形式)
如:浮点数5.5,只保留011这个小数部分

3)指数E的储存

E为⼀个⽆符号整数(unsigned int),意味着,如果E为8位,它的取值范围为0到255;如果E为11位,它的取值范围为0到2047。但是,科学计数法中,指数E可能是负数!!!
所以👇🏻
IEEE 754规定,E存⼊内存时,E的真实值必须再加上⼀个中间数:
•对于8位的E,这个中间数是127
•对于11位的E,这个中间数是1023
⽐如,5.52^2的E是2,所以保存成32位浮点数时,必须保存成2+127=129,即10000001

所以浮点数5.5在内存中的储存应该是:
在这里插入图片描述

2,浮点数取的过程

1)E不全为0或不全为1

•指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1
如取5.5
•S = 0
•E:10000001(十进制的129),129-127 = 2 ,得到真实值E = 2
•再将有效数字M(011)前加上第⼀位的1,得1.011
所以,5.5 = (-1)^0 × 1.011 × 2^2

2)E全为0

表示趋近于0的很小的数字
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还
原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字

0 00000000 00100000000000000000000

3)E全为1

表⽰±⽆穷⼤(正负取决于符号位S)

0 11111111 00010000000000000000000

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GitOps实践指南:GitOps能为我们带来什么?

Git&#xff0c;作为开发过程中的核心工具&#xff0c;提供了强大的版本控制功能。即便在写代码的时候稍微手抖一下&#xff0c;我们也能通过 Git 的差异对比&#xff08;diff&#xff09;轻松追踪到庞大工程中的问题&#xff0c;确保代码的准确与可靠。这种无与伦比的自省能力…

FreeRTOS中断、临界区和任务调度器

一、中断 中断是 CPU 的一种常见特性&#xff0c;中断一般由硬件产生&#xff0c;当中断发生后&#xff0c;会中断 CPU 当前正 在执行的程序而跳转到中断对应的服务程序种去执行&#xff0c;ARM Cortex-M 内核的 MCU 具有一个 用于中断管理的嵌套向量中断控制器NVIC。ARM Cort…

【数据库】为什么要分库分表

为什么要分库分表 1.为什么要分库分表&#xff1f;2.垂直拆分3.水平拆分4.总结4.1 逻辑库和物理库4.2 逻辑表和物理表 1.为什么要分库分表&#xff1f; 随着近些年信息化大跃进&#xff0c;各行各业无纸化办公产生了大量的数据&#xff0c;而越来越多的数据存入了数据库中。当…

Vue 问题解决

一、问题&#xff1a;TypeError: (0 , _message.default) is not a function 当没有default时,在其他页面import引入的时&#xff0c;必须加{}。 二、问题&#xff1a;Vue前端页面的表格数据总是一行一行的显示 使用Async/Await来解决前端数据一行一行显示的问题。可以将获取部…

python 实现粒子群算法(带绘制)

本文章用python实现了粒子群算法&#xff0c; 标准PSO的算法流程如下&#xff1a; 初始化一群微粒&#xff08;群体规模为m&#xff09;&#xff0c;包括随机的位置和速度&#xff1b;评价每个微粒的适应度&#xff1b;对每个微粒&#xff0c;将它的适应值和它经历过的最好位…

众和策略股市行情分析:股票开户后什么时候能交易?

股票开户后什么时候能生意&#xff1f; 股票开户后不才一生意日便能正常展开生意操作&#xff0c;包含申报股票生意及非生意事务。假设投资者是周五或接近节假期时结束的开户&#xff0c;就要不才周一或假期结束后才华进行生意。 当然&#xff0c;假设投资者注册的是一些特别…

BDD - Python Behave 配置文件 behave.ini

BDD - Python Behave 配置文件 behave.ini 引言behave.ini配置参数的类型配置项 behave.ini 应用feature 文件step 文件创建 behave.ini执行 Behave 引言 前面文章 《BDD - Python Behave Runner Script》就是为了每次执行 Behave 时不用手动敲一长串选项&#xff0c;其实还有…

《深入理解C++11:C++11新特性解析与应用》笔记四

第四章 新手易学&#xff0c;老兵易用 4.1 右尖括号>的改进 在 C98 中&#xff0c;有一条需要程序员规避的规则:如果在实例化模板的时候出现了连续的两个右尖括号 >&#xff0c;那么它们之间需要一个空格来进行分隔&#xff0c;以避免发生编译时的错误。C98 会将>&g…

【量化】蜘蛛网策略复现

文章目录 蜘蛛网策略研报概述持仓数据整理三大商品交易所的数据统一筛选共有会员清洗数据计算研报要求数据全部代码 策略结果分析无参数策略有参数策略正做反做 MSD技术指标化 蜘蛛网策略 策略来自《东方证券-股指期货趋势交易之蜘蛛网策略——从成交持仓表中捕捉知情投资者行为…

腾讯云轻量应用服务器详细介绍

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别优惠&#xff0c;轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元3年、4核8G12M带宽646元15个月等&#xf…

Linux操作系统:LVM与磁盘配额

目录 一、LVM逻辑卷管理基础 1、LVM逻辑卷管理的概念 2、LVM逻辑卷管理的核心组件 3、LVM逻辑卷管理的优势 4、LVM逻辑卷管理的命令 4.1 扫描命令的用法 4.1.1 pvscan 4.1.2 vgscan 4.1.3 lvscan 4.2 查看命令的用法 4.2.1 pvdisplay 4.2.2 vgdisplay 4.2.3 lvdis…

12.27_黑马数据结构与算法笔记Java(补2)

目录 279 0-1 背包问题 动态规划 实现 280 0-1 背包问题 动态规划 降维 281 完全背包问题 动态规划 分析 282 完全背包问题 动态规划 实现 283 零钱兑换问题 动态规划 分析 284 零钱兑换问题 动态规划 实现 285 零钱兑换问题 动态规划 降维 286 零钱兑换II 动态规划 分析…

【idea】运行工程时候卡了许久Java Method Breakpoints

老以为是数据库连接不上&#xff0c;此问题概率性小&#xff0c;操作上面不小心打了断点… 应该是打断点的时候&#xff0c;打到了方法上面&#xff0c;去掉哟 Java Method Breakpoints

C++day2作业

把课上strcut的练习&#xff0c;尝试着改成class #include <iostream>using namespace std; class Stu { private:int age;string sex;int hign; public:int soce;void get_information();void set_information(); }; void Stu::set_information() {static Stu s1;cout …

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

「从红月开始」运输公司遭精神污染,小十七救哥哥,事发地陷危机

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《从红月开始》第3集超前爆料&#xff0c;本次透露陆辛首次被派遣去调查精神污染的任务。他的目的地是四方运输公司&#xff0c;一个主要由亡命之徒组成的组织。他们表面上从事运输业务&#xff0c;但背地里进行偷渡和走私活动。 …

【CSAPP】探究BombLab奥秘:Phase_2的解密与实战

&#x1f4cb; 前言 ​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《斯坦福大学之CSAPP》⏰诗赋清音&#xff1a;桃花灼灼春风暖&#xff0c;心随乐曲扬徐徐。 苦尽甘来梦未阑&#xff0c;岁月长河任舟游。 ​ &#x1f389;欢迎…

cnPuTTY 0.80.0.1—PuTTY Release 0.80中文版本简单说明~~

2023-12-18 官方发布了PuTTY 0.80本次发布主要是针对Terrapin攻击(CVE-2023-48795)的修改发布。 更多详细的内容请查看PuTTY Change Log。 有关Terrapin攻击可用简单参考&#xff1a;警告&#xff01;&#xff01;&#xff01;Terrapin攻击(CVE-2023-48795)~~~ 为了缓解此漏洞…

【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗&#xff1f; 如果你进行的矩阵乘法涉及一个线性方程组 Ax b&#xff0c;并且你乘以一个可逆矩阵 M&#xff0c;且产生新的方程组 M(Ax) Mb&#xff0c;那么这两个系统是等价的&#xff1b;它们具有相同的解集。这…

【unity3D-粒子系统】粒子系统主模块-Particle System篇

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的粒子系统主模块-Particle System 基础知识 Particle System 介绍&#xff1a;粒子系统的主模块&#xff0c;是必需的模块&#x…
最新文章