数据在内存中的存储方式

前言:已经好久没更新了,开学之后学习编程的时间少了很多。因此,已经好几个礼拜都没有写文章了。

在讲解操作符的时候,我们就已经学习过了整数在内存中的存储方式。若有不懂的伙伴可以前往操作符详解进行学习。今天我们主要来学习浮点数在内存中的存储方式

首先我们通过几个例子来回顾一下整数在内存中的存储方式。

#include <stdio.h>
int main()
{char a = -1;//10000000000000000000000000000001  ---原码//11111111111111111111111111111110  ---反码//11111111111111111111111111111111  ---补码// 发生截断//a ---11111111signed char b = -1;//11111111111111111111111111111111  ---补码// 发生截断//b ---11111111unsigned char c = -1;//发生截断//c ---11111111// 发生整型提升//a ---11111111111111111111111111111111---补码//10000000000000000000000000000000//10000000000000000000000000000001 ----原码//发生整型提升//c ---00000000000000000000000011111111//255printf("a=%d,b=%d,c=%d", a, b, c);//a=-1,b=-1,c=255return 0;
}
#include <stdio.h>
int main()
{char a = -128;//10000000000000000000000010000000 ---原码//11111111111111111111111101111111 ---反码//11111111111111111111111110000000 ---补码// 发生截断//a ---10000000// 整型提升// %u是以无符号的整型打印//11111111111111111111111110000000printf("%u\n", a); //4, 294, 967, 168return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{//字符数组char a[1000] = { 0 };int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}//strlen是一个求取字符串长度的库函数,求取的是\0之前的字符个数//\0的ASCII码值是0//signed char的取值范围是-128~127printf("%d", strlen(a));//255return 0;
}

浮点数类型包括float,double,long double

看下面的一道题

#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;
}

输出的结果是什么呢?相必很多人都会答错吧。

这道题暂且放下,等我们学习完浮点数的存储之后,再来解答这道题。

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可表示成下列形式:V=(-1)^S*M*2^E

S为0时,V为正数;S为1时,V为负数
M表示有效数字,大于等于1,小于2的
2^E是指数位

例如5.0的二进制是101.0,相当于V=(-1)^0*1.01*2^2,那么S=0,M=1.01,E=2

-5.0的二进制是-101.0,相当于V=(-1)^1*1.01*2^2,那么S=1,M=1.01,E=2

IEEE754规定:

对于32位的浮点数最高的一位存储S,接下来的8位存储E,剩下的23位存储有效数字M

对于64位浮点数最高的一位存储S,接下来的11位存储E,剩下的52位存储有效数字M

在这里插入图片描述


在这里插入图片描述

. 浮点数存的过程

IEEE754对于指数E和M还有一些特别的规定。

前面说过,1<=M<2,也就是说M是可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE754规定,在计算机内存中保存M时,默认这个数的第一位总是1,因此可以被舍去只保存后面的小数部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的是节省1位有效数字,提高了数据保存的精确度

至于指数E则更加的复杂。E是一个无符号的整数(unsigned int)。这意味着,如果E为8位,它的取值范围是0~255,如果E为11位,它的取值范围是0~2047。但是在科学计数法中,E是可以出现负数的。所以IEEE754规定,存入内存中E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023

. 浮点数取的过程

指数E从内存中取出可分为3种情况:

指数E不全为0或不全为1

指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1

比如0.5的二进制是0.1V=(-1)^0*1.0*2^-1S=0,M=1.0,E=-1E存入内存的值是-1+127=126126的二进制是01111110

0  01111110  00000000000000000000000
|       |                 |
|       |                 |
|       |                 |
S       E                 M

指数E全为0

指数E就等于1-127(或1023)即为E的真实值,有效数字M不再加上第一位的1,而是还原成0.xxxxxx的小数。这样做是为了表示正负0,以及接近于0很小的数字

0 00000000 00100000000000000000000

指数E全为1

有效数字M全为0,则表示正负无穷大(正负取决于符号位S)

0  11111111  00000000000000000000000

浮点数的存储就说完了。接下来让我们回到最初开始的问题。

#include <stdio.h>
int main()
{//9是一个整型,在内存中的存储是以二进制的形式存储的//0 00000000 00000000000000000001001int n = 9;//pFloat是一个浮点型的指针,指向的对象是一个浮点型数据//S = 0,E = 00000000,M = 00000000000000000001001float* pFloat = (float*)&n;printf("n的值为:%d\n", n);//9//32位环境下//E全为0,E的真实值就等于1-127=-126//M=0.00000000000000000001001//V=(-1)^0*1.001*2^(-146),很显然这是一个接近于0的正数printf("*pFloat的值为:%f\n", *pFloat);//0.000000//将n的值改为9.0*pFloat = 9.0;//1001.0//S=0,M=1.0010,E=3//V=(-1)^0*1.001*2^3,存入内存中E的值是3+127=130// 130的二进制位是10000010//01000001000100000000000000000000printf("num的值为:%d\n", n);//1,091,567,616printf("*pFloat的值为:%f\n", *pFloat);//9.000000return 0;
}

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

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

相关文章

[数据集][目标检测]智慧交通铁路人员危险行为躺站坐检测数据集VOC+YOLO格式3766张4类别

图片数量(jpg文件个数)&#xff1a;3766 标注数量(xml文件个数)&#xff1a;3766 标注数量(txt文件个数)&#xff1a;3766 标注类别数&#xff1a;4 标注类别名称:["sitting","sleeping","standing","track"] 每个类别标注的框数&…

NC 矩阵最长递增路径

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个 n 行…

<Linux> 进程间通信

目录 一、进程间通信介绍 1. 进程间通信概念 2. 进程间通信目的 3. 进程间通信的本质 4. 进程间通信发展 5. 进程间通信分类 管道&#xff08;文件缓冲区&#xff09; System V IPC POSIX IPC 二、管道 1. 匿名管道 1.1 匿名管道原理 1.2 pipe系统调用 1.3 匿名管道的使用 1.4…

Java项目基于docker 部署配置

linux新建文件夹 data cd datatouch Dockerfilesudo vim Dockerfile# 使用一个基础的 Java 镜像&#xff08;根据自己项目中使用的是什么jdk版本设置&#xff0c;用于拉取执行jar包的jdk环境&#xff09; FROM openjdk:8# 指定工作目录 VOLUME /data# 复制应用程序的 JAR 文件…

超详解——​深入理解Python中的位运算与常用内置函数/模块——基础篇

目录 ​编辑 1.位运算 2.常用内置函数/模块 math模块 random模块 decimal模块 常用内置函数 3.深入理解和应用 位运算的实际应用 1.权限管理 2.位图 3.图像处理 2.math模块的高级应用 统计计算 几何计算 总结 1.位运算 位运算是对整数在内存中的二进制表示进行…

nginx负载均衡(轮询与权重)

文章目录 1. nginx的介绍2. nginx使用场景3. nginx在windows的下载与安装4. nginx的简单使用5. nginx进行轮询测试6. nginx进行权重测试7. 总结 1. nginx的介绍 Nginx&#xff08;engine x&#xff09;是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也是一个开源的、…

CSS 响应式设计(补充)——WEB开发系列36

随着移动设备的普及&#xff0c;网页设计的焦点逐渐转向了响应式设计。响应式设计不仅要求网页在各种屏幕尺寸上良好展示&#xff0c;还要适应不同设备的特性。 一、响应式设计之前的灵活布局 在响应式设计流行之前&#xff0c;网页布局通常是固定的或流动的。固定布局使用固定…

MySQL练手题--体育馆的人流量(困难)

一、准备工作 Create table If Not Exists Stadium (id int, visit_date DATE NULL, people int); Truncate table Stadium; insert into Stadium (id, visit_date, people) values (1, 2017-01-01, 10); insert into Stadium (id, visit_date, people) values (2, 2017-01-02…

MouseArea元素

常用信号 onClicked&#xff0c;鼠标点击onPressed&#xff0c;鼠标按下onReleased&#xff0c;鼠标释放 import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Rectangle{id:rectwidth: 100height: 100color:"red"MouseA…

视频监控平台是如何运作的?EasyCVR视频汇聚平台的高效策略与实践

随着科技的飞速发展&#xff0c;视频监控平台在社会安全、企业管理、智慧城市构建等领域发挥着越来越重要的作用。一个高效的视频监控平台&#xff0c;不仅依赖于先进的硬件设备&#xff0c;更离不开强大的视频处理技术作为支撑。这些平台集成了多种先进的视频技术&#xff0c;…

Redis集群_cluster

cluster集群 cluster翻译就是集群&#xff0c;所以cluster集群也叫做redis集群相比于哨兵模式&#xff0c;cluster集群能支持扩容&#xff0c;并且无需额外的节点来监控状态&#xff0c;所以使用这种模式集群的系统会用的更多些redis cluster采用的是去中心化网络拓扑架构&…

git push : RPC failed; HTTP 400 curl 22 The requested URL returned error: 400

git push 出现RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 问题 git push Enumerating objects: 11, done. Counting objects: 100% (11/11), done. Delta compression using up to 8 threads Compressing objects: 100% (10/10), done. error: RPC …

漫画元素检测系统源码分享

漫画元素检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【开源分享】vsomeip 安装、编译、运行步骤笔记

文章目录 1. 摘要2. 安装、编译2.1 开发环境说明2.2 安装依赖2.3 获取代码2.4 编译代码2.5 安装 3. 测试验证参考 1. 摘要 本文主要描述 vsomeip 的安装、编译与运行步骤。下载源码&#xff0c;安装必要依赖&#xff0c;如Boost和CMake。通过CMake配置编译 vsomeip 库&#xf…

【C++】unordered系列

前言&#xff1a; 在C11及以后的标准中&#xff0c;unordered容器是标准模板库&#xff08;STL&#xff09;的一部分&#xff0c;提供了高效的数据结构选项&#xff0c;适用于需要快速查找和插入操作的场景。 unordered通常与关联容器一起使用&#xff0c;特别是unordered_map和…

详解HTTP/HTTPS协议

HTTP HTTP协议全名为超文本传输协议。HTTP协议是应用层协议&#xff0c;其传输层协议采用TCP协议。 请求—响应模型 HTTP协议采用请求-响应模型&#xff0c;通常由客户端发起请求由服务端完成响应。资源存储在服务端&#xff0c;客户端通过请求服务端获取资源。 认识URL 当…

01,大数据总结,zookeeper

1 &#xff0c;zookeeper &#xff1a;概述 1.1&#xff0c;zookeeper&#xff1a;作用 1 &#xff0c;大数据领域 &#xff1a;存储配置数据   例如&#xff1a;hadoop 的 ha 配置信息&#xff0c;hbase 的配置信息&#xff0c;都存储在 zookeeper 2 &#xff0c;应用领…

TDengine 与飞腾腾锐 D2000 完成兼容互认证,推动国产软硬件深度融合

在国家信息安全和自主可控技术日益受到重视的背景下&#xff0c;国产软硬件的发展已成为推动数字经济的重要力量。随着全球科技竞争加剧&#xff0c;企业在选择技术解决方案时&#xff0c;越来越倾向于采用国产产品以降低对外部技术的依赖。这一趋势不仅是为了确保数据安全与隐…

信息安全数学基础(14)欧拉函数

前言 在信息安全数学基础中&#xff0c;欧拉函数&#xff08;Eulers Totient Function&#xff09;是一个非常重要的概念&#xff0c;它与模运算、剩余类、简化剩余系以及密码学中的许多应用紧密相关。欧拉函数用符号 φ(n) 表示&#xff0c;其中 n 是一个正整数。 一、定义 欧…

模拟视频推到WVP推流列表

效果 1. wvp创建RTMP 2. 使用ffmpeg将本地的视频转为rtmp ffmpeg -re -i F:rtsp\123.mp4 -c copy -f flv rtmp://192.168.1.237:1935/cd/10001?sign=Z4Y3eYeSg