C语言整数和小数的存储

1.整数在内存中的存储
计算机使用二进制进行存储、运算,整数在内存中存储使用的是二进制补码
1.1原码、反码、补码
整数的2进制表⽰⽅法有三种,即 原码、反码和补码
三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最 ⾼位的⼀位是被当做符号位,剩余的都是数值位
正整数的原、反、补码都相同, 负整数的三种表⽰⽅法各不相同
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码
补码:反码+1就得到补码
添加一点小知识:正整数的原码等价于反码,也等价于补码
而负整数的补码可以由原码进行“取反,+1”得到,补码改成原码,同样可以进行“取反,+1”得到,也可以“-1,取反”
1.2 整数的存储使用补码
在计算机中,都是采用补码对整数进行存储,原因如下:
使⽤补码,可以将符号位和数值域统⼀处理(数值位,也叫数值域)
使用补码进行数值运算,可以转化为加法运算(计算机的CPU只有加法器,无需增加更多的 硬件专门去处理减法运算)
1.3大小端字节序
内存以字节为单位进行存储,而数据在内存中是连续存储的,有低地址和高地址
大小端字节序,其实说的是超过一个字节的数据在内存中存储的顺序,按照不同的存储顺序,我们分 为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:
⼤端存储模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存 在内存的低地址处
⼩端存储模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存 在内存的⾼地址处
给出一个实际的例子:

VS2022上采用的是小端存储,在VS2022上调试验证一下:

可以看到右上方第一个的存储方式,就是上述所说的那样
2.浮点数在内存中的存储
在学习浮点数的存储之前,先来看一段代码
#include <stdio.h>
int main()
{
int n = 9;
float* pFloat = (float*)&n;
printf("n的值为:%d\n", n);
printf("*pFloat的值为:%f\n", *pFloat);
*pFloat = 9.0;
printf("num的值为:%d\n", n);
printf("*pFloat的值为:%f\n", *pFloat);
return 0;
}

运行结果:
n的值为:9
*pFloat的值为:0.000000
num的值为:1091567616
*pFloat的值为:9.000000
通过观察发现:
存放整数的变量,用整数形式打印,没有问题
而强制转化为浮点型,值变化了
而存放浮点数的变量,用浮点型打印,也没有问题
强制转化为整型,值也变化了
可以猜想,是不是整形在内存中的存储方式与浮点型在内存中的存储方式不同?
阿林:的确如此
2.1 科学计数法
一个十进制小数或整数,都可以用科学计数法表示出来:
如: 23.45
= 2.345 * 10 ^1
456.12
=4.5612 * 10 ^ 2
浮点数在内存中的存储,其实就是根据科学计数法改变而来的
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯
十进制的 5.5 ,用二进制表示就是101.1
1 * 2^2 + 1 * 2^0 + 1 * 2^-1 = 5.5
因为按照上面的写法,只需要获得 S 、M 、E就可以还原计算机存储的浮点数,所以
内存中只存 S 、 M 、E的值
2.2浮点数的存储
IEEE 754规定:对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M

而对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
64位的浮点数的排列顺序和上面一样,只是E、M的可用大小变大了
IEEE 754 对有效数字M和指数E,还有⼀些特别规定
2.3M的特别规定
因为 1≤M < 2 ,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表⽰⼩数部分。
IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的xxxxxx部分
⽐如说保存1.01,只保存01,等到读取的时候,再把第⼀位的1还原回去
这样做的话,可以节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字
2.4E的特别规定
E被定义为一个无符号的数(unsigned int)
这说明,如果E为8位,它的取值范围为0~255;
如果E为11位,它的取值范围为0~2047。
但是,我们知道,科学计数法中的E是可以出现负数的:比如数字 0.1 , E为-1;
所以IEEE 754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;
对于11位的E,这个中间数是1023。
⽐如,2 ^ 10的E是10,所以保存成32位浮点数时,必须保存成10 + 127 = 137,即10001001
2.5浮点数的取出
指数E从内存中取出还可以再分成三种情况
1.E不全为0或不全为1
这时,浮点数就采⽤下⾯的规则表⽰
即指数E的计算值减去127(或1023),得到真实值,再将有效 数字M前加上第⼀位的1。
⽐如:0.5 的⼆进制形式为0.1,由于规定正数部分必须为1,即将⼩数点右移1位,则为1.0*2^(-1),其 阶码为-1+127(中间值)=126,表⽰为01111110
⽽尾数1.0去掉整数部分为0,补⻬0到23位 00000000000000000000000,则其⼆进制表⽰形式为:
0 01111110 00000000000000000000000
2.E为全0
此时,浮点数的指数E等于1-127(或者1-1023)即为真实值
有效数字M不再加上第⼀位的1,⽽是还 原为0.xxxxxx的⼩数
这样做是为了表⽰±0,以及接近于0的很⼩的数字
1 0 00000000 00100000000000000000000
3.E为全1
这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位S)
0 11111111 00010000000000000000000
相关文章:
C语言整数和小数的存储
1.整数在内存中的存储 计算机使用二进制进行存储、运算,整数在内存中存储使用的是二进制补码 1.1原码、反码、补码 整数的2进制表⽰⽅法有三种,即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”&am…...
Games101Homework【6】Acceleration structure(Including framework analysis)
Code Analysis: friend: C中友元(友元函数和友元类)的用法和功能_friend class a<b>-CSDN博客 [C:不如Coding](11):友元函数与友元类_哔哩哔哩_bilibili Here is a simple…...
应用运维文档1
统一nginx接入配置指南 Nginx配置规范 1:不带微服务编码上下文至后端,以metadata-ui为例 location段配置信息,location配置中维护微服务编码上下文信息 # app_code: metadata-ui 流水线名称: metadata-ui location ~ ^/metadata-ui/(?P.*) {set $app_code metadata-ui;p…...
手机如何在线制作gif?轻松一键在线操作
现在大家都喜欢使用手机来拍摄记录有趣的事物,但是时间长了手机里的视频越来越多导致手机存储空间不够了,这些视频又不想删除时应该怎么办呢?这个很简单,下面就给大家分享一款不用下载手机就能操作的视频转gif网站-GIF中文网&…...
ChatGPT 在做什么,为什么有效?
原文:What Is ChatGPT Doing … and Why Does It Work? 译者:飞龙 协议:CC BY-NC-SA 4.0 序言 这本简短的书试图从第一原理解释 ChatGPT 是如何工作的。在某种程度上,这是关于技术的故事。但它也是关于科学的故事。以及关于哲学…...
Linux实验2 初步使用shell
一:实验目的 学习Linux下的文件系统结构,了解最基本的Linux下的shell命令操作,例如ls, cd, cat等各种指令操作。 学习vim编辑器的使用方式,学习如何使用ssh连接远程服务器。 二:实验内容 1.请指出下面每…...
甘特图/横道图制作技巧 - 任务组
在甘特图中通过合理的任务分组可以让项目更加清晰,修改也更方便。 列如下面的甘特图一眼不太容易看清楚整体的进度。或者需要把所有的任务整体的延迟或者提前只能这样一个一个的任务调整,就比较麻烦。 通过给任务分组,看这上面整体的进度就…...
Web题记
反序列化补充知识: private变量会被序列化为:\x00类名\x00变量名 protected变量会被序列化为: \x00\*\x00变量名 public变量会被序列化为:变量名web254 这个逻辑不难,自己刚看的时候还奇怪是不是自己哪里想错了,因为…...
学习java第三十六天
Spring 官网列出的 Spring 的 6 个特征: 核心技术 :依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。 测试 :模拟对象,…...
0205矩阵分块法-矩阵及其运算-线性代数
文章目录 1 分块矩阵的定义2 分块矩阵的运算(性质)3 按列分块与按行分块 结语 1 分块矩阵的定义 将矩阵A用若干条纵线和横线分成许多个小矩阵,每一个小矩阵称为A的子快,以子块为元素的形式上的矩阵称为分块矩阵。 2 分块矩阵的运算…...
1、java语法入门(找工作版)
文章目录 一、Java简介二、Java常量与变量1、标识符2、关键字3、变量4、类的命名规则5、数据类型6、基本数据类型字面值7、变量的定义与初始化8、ASCII码和Unicode编码9、转义字符10、类型转换11、常量 三、Java运算符1、算术运算符2、赋值运算符3、关系运算符4、逻辑运算符5、…...
arm的状态寄存器
目录 一、arm 的 PSRs二、CPSR2.1 CPSR_cxsf 三、SPSR四、APSR 一、arm 的 PSRs arm 中有很多程序状态寄存器(Program Status Registers,PSRs)用于存储处理器的状态信息,包括 CPSR\SPSR\FPSR\APSR 等: CPSRÿ…...
2024 蓝桥打卡Day34
20240406蓝桥杯备赛 1、学习蓝桥云课省赛冲刺课 【1-手写与思维】【2-递归与递推】2、学习蓝桥云课Java省赛无忧班 【1-语言基础】3、代码练习字符串排序大小写转换 (ccfcsp之前要是学了我就能上200了 啊啊啊啊 错过啊)斐波那契数列 递归解法纸张尺寸问题…...
华为海思校园招聘-芯片-数字 IC 方向 题目分享——第九套
华为海思校园招聘-芯片-数字 IC 方向 题目分享(有参考答案)——第九套 部分题目分享,完整版获取(WX:didadidadidida313,加我备注:CSDN huawei数字芯片题目,谢绝白嫖哈) 单选 1&…...
如何创建虚拟环境打包py文件
Python 项目通常依赖于特定的库和版本。不同的项目可能依赖于相同库的不同版本,这可能导致冲突。使用虚拟环境,你可以为每个项目创建一个独立的 Python 环境,每个环境都有自己的库和版本,从而避免了依赖冲突。 采用虚拟环境打包P…...
CSS 学习笔记 总结
CSS 布局方式 • 表格布局 • 元素定位 • 浮动布局(注意浮动的负效应) • flex布局 • grid布局(感兴趣的可以看下菜鸟教程) 居中设置 元素水平居中 • 设置宽度后,margin设置为auto • 父容器设置text-alig…...
基于Swin Transformers的乳腺癌组织病理学图像多分类
乳腺癌的非侵入性诊断程序涉及体检和成像技术,如乳房X光检查、超声检查和磁共振成像。成像程序对于更全面地评估癌症区域和识别癌症亚型的敏感性较低。 CNN表现出固有的归纳偏差,并且对于图像中感兴趣对象的平移、旋转和位置有所不同。因此,…...
MySQL主从的介绍与应用
mysql主从 文章目录 mysql主从1. 主从简介1.1 主从作用1.2 主从形式 2. 主从复制原理3. 主从复制配置3.1 mysql安装(两台主机安装一致,下面只演示一台主机操作)3.2 mysql主从配置3.2.1 确保从数据库与主数据库里的数据一样3.2.2 在主数据库里…...
pytest中文使用文档----12缓存:记录执行的状态
1. cacheprovider插件 1.1. --lf, --last-failed:只执行上一轮失败的用例1.2. --ff, --failed-first:先执行上一轮失败的用例,再执行其它的1.3. --nf, --new-first:先执行新加的或修改的用例,再执行其它的1.4. --cache…...
【代码随想录】哈希表
文章目录 242.有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和454. 四数相加 II383. 赎金信15. 三数之和18. 四数之和 242.有效的字母异位词 class Solution {public boolean isAnagram(String s, String t) {if(snull || tnull || s.length()!t.length()){return …...
STM32开发中的C语言高效编程技巧
STM32开发中的C语言高效编程技巧1. 位操作在寄存器控制中的应用1.1 位操作基础在STM32嵌入式开发中,C语言提供了六种基本位操作运算符:&按位与|按位或^按位异或~按位取反<<左移>>右移1.2 寄存器位操作技巧1.2.1 特定位置位/清零// 设置G…...
告别C++复杂配置:5分钟在UE5里搞定一个简单的HTTP客户端
告别C复杂配置:5分钟在UE5里搞定一个简单的HTTP客户端 在独立游戏开发和教育领域,快速验证网络交互功能的需求日益增长。无论是从服务器拉取动态配置,还是提交玩家成绩数据,一个轻量级的HTTP客户端往往能大幅提升原型开发效率。传…...
数据开发平台如何落地实操?数据开发平台核心价值是什么?
数据开发平台是企业数字化建设的核心载体,搭建合规高效的数据开发平台,才能打通数据流转全链路,而多数企业落地数据开发平台时,往往陷入流程混乱、效率低下的困境。开始之前给大家分享一份数字化全流程资料包:https://s.fanruan.c…...
基于.NET 11 与C# 14的高性能安全客户端应用开发
基于.NET 11 与C# 14的高性能安全客户端应用开发 前言 在客户端应用开发领域,性能与安全始终是关键指标。随着.NET 11 和 C# 14 的推出,开发者拥有了更强大的工具来构建高性能且安全可靠的客户端应用。这些新技术不仅提升了应用的运行效率,还…...
高分二号卫星全解析:从光谱波段到城市管理的实战应用
1. 高分二号卫星的技术参数详解 高分二号卫星作为我国首颗亚米级高分辨率民用光学遥感卫星,其技术参数直接决定了它在城市管理中的应用能力。先说说最核心的空间分辨率:全色波段0.8米意味着能清晰识别小轿车级别的物体,多光谱3.2米分辨率则适…...
Fillinger终极指南:Illustrator智能填充脚本如何10倍提升你的设计效率
Fillinger终极指南:Illustrator智能填充脚本如何10倍提升你的设计效率 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是否曾在Illustrator中为了填充图案而花费数小时…...
vLLM-v0.17.1效果展示:128K上下文下PagedAttention稳定性验证
vLLM-v0.17.1效果展示:128K上下文下PagedAttention稳定性验证 1. vLLM框架核心能力 vLLM是一个专为大语言模型推理优化的高性能服务库,最新发布的v0.17.1版本在超长上下文处理能力上实现了重大突破。这个最初由加州大学伯克利分校开发的框架࿰…...
嵌入式系统常用轻量级校验算法解析
单片机中常用的轻量级校验算法 1. 校验算法概述 在嵌入式系统开发中,数据校验是确保通信可靠性和数据完整性的关键技术手段。无论是UART通信中的奇偶校验、CAN总线中的CRC校验,还是Modbus、MAVlink、USB等协议中的校验机制,都体现了校验算法…...
避坑指南:华为CNA VRM在VMware Workstation中的常见配置错误及解决方案
华为CNA VRM在VMware Workstation中的实战避坑手册 在虚拟化技术快速发展的今天,越来越多的企业选择在本地环境中搭建云计算平台进行测试和开发。华为的Cloud Native Architecture(CNA)和Virtual Resource Manager(VRM)…...
别再为长文档发愁了!用DeepSeek-OCR + 单块A100,5步搞定古籍/财报批量识别
单块A100实战指南:用DeepSeek-OCR高效处理古籍与财报的5个关键步骤 当某省级图书馆需要数字化10万页明清古籍时,技术团队发现传统OCR方案需要3个月才能完成,而采用DeepSeek-OCR配合单块A100的方案,仅用11天就交付了准确率92%的数…...

