数据在内存中的存储

目录

数据类型

大小端 

判断大小端 

练习

1

 2

浮点数在内存中储存

 存M

存E

 取E


数据类型

整形家族:

char
 unsigned char
 signed char
short
 unsigned short [int]
 signed short [int]
int
 unsigned int
 signed int
long
 unsigned long [int]
 signed long [int]

其中signed类型和不写signed是一种类型。

char被归入整形是因为它本质储存ascii码值为二进制。

浮点型 

float

double

构造类型 

> 数组类型
> 结构体类型 struct
> 枚举类型 enum
> 联合类型 union

 指针类型

int *pi;
char *pc;
float* pf;
void* pv;

空类型 

void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型。

大小端 

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。

其实可以理解为我们站队时按从低到高还是从高到低排序,每个内存单元以字节为单位,超过一个字节就会出现如何安排字节的问题,所以就有了大小端。我们也可以通过调试观察编译器的存放模式。

 用16进制我们可以看到编译器采用的是小端字节序的排列方式。

判断大小端 

要证明是大端还是小端,我们可以创建一个字节数大于1的变量(这样才有大小端),然后对首字节进行判断即可。访问一个字节我们可以用char*。

int check_sys()
{int a = 1;if (*(char*)&a == 1)return 1;elsereturn 0;
}
//int check_sys()
//{
//	int a = 1;
//	return *(char*)&a;
//}
int main()
{if(check_sys() == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

练习

1

我们先来看看这样一段代码:

 char a = -128;printf("%u", a);

请问这段代码会输出什么结果呢?我们得进行补码运算得到它的二进制码

-128补码: 10000000(转化成int后截断放入char的二进制码)

unsigned int类型输出a,发生整形提升(补符号位):11111111111111111111111110000000,由于最高位是1,要转化成原码,得到一个很大的正数,我们可以验证一下。

 2

有这样一段代码:

        char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d", strlen(a)); 

我们先来分析for循环内部,有1000个元素,元素取值从-1到-1000,但对于char类型来说,它的取值范围为-128~127, 当超过-128时,数据会跳到127去,也就是从最小变到最大,反过来也成立。可以理解成下面的循环:

1

也就是说,该程序在进行128+127 = 255次循环后将遇到\0,所以会输出255。 

 同样,这段代码也会出现相同的错误,造成死循环:

        unsigned char i = 0;for (i = 0; i <= 255; i++){printf("hello world\n");}

浮点数在内存中储存

浮点数用于储存小数,但在储存一些数比如说无理数时可能会丢失精度。我们可以在limits.h查找整形家族的取值范围和从float.h中查找浮点型家族的取值范围。

我们先来看一段奇怪的代码: 

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);

你们可能以为结果为9,9.000000,9,9.000000,但真实结果却是这样的:

        好,我们来看下浮点数的储存方式——

根据IEE754标准,我们可以将二进制浮点数V这样表示:

  • (-1)^S * M * 2^E
  • (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
  • M表示有效数字,大于等于1,小于2。
  • 2^E表示指数位

例:5.5转化成二进制:

>>>2^2 + 2^0 +2^-1 = 101.1 (小数点后表示2^-1,2^-2....)

转化成(-1)^S * M * 2^E的形式:

>>>(-1)^0 * 1.011 * 2^2

现在我们来看内存中的储存模型:

 存M

M的取值范围规定为1<=M<2,计算机保存M时,默认保存的第一个数为1,所以可以省去使其能储存24个bit位

存E

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

 取E

复杂的是,取E分为3种情况:

  1. E不全为0且不全为1
  2. E全为0
  3. E全为1

        第一种情况取出时减去127即可得可。

        第二种情况我们通过分析,全为0时E = -127, 已经是一个极其小的数,还原时不再加上第一位的1,而是还原成0.xxxx的小数(1-127或1-1023为E的真实值),这样做是为了表示±0和接近0的的很小的数字。

        第三种情况就表示一个很大的数字,表示±无穷大

对于刚才的(-1)^0 * 1.011 * 2^2,我们可以这样存储:
>>>0 10000001 011000000000000000000000

转化成16进制:

>>>40b00000

内存中存储(小端字节序):
>>>00 00 b0 40

现在回到最初的问题代码:

float* pFloat = (float*)&n;

通过这段代码通过创建一个float指针接收了被强转的int类型的地址&n,使其看作IEE754标准存储。

将pFloat按照%f输出时9的补码为:

0 00000000 00000000000000000001001

转换成数字:

(-1)^0 * 0.00000000000000000001001 * 2^-126
//打印0.000000

第二次将9.0这个浮点型放入pfloat,经过下面的变换:

    9.01001.01.001 * 2^3(-1)^0 * 1.001 *2^3

得到内存空间:

01000001000100000000000000000000

将其按整形补码(原反补相同)输出得到:1,091,567,616

按浮点形输出得到:9.000000

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

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

相关文章

Day_14 > 指针进阶(3)> bubble函数

目录 1.回顾回调函数 2.写一个bubble_sort函数 2.1认识一下qsort函数 ​编辑2.2写bubble_sort函数 今天我们继续深入学习指针 1.回顾回调函数 我们回顾一下之前学过的回调函数 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针&#xff08;地址&#xff09;…

数据可视化大屏模板 | 保姆级使用教程

近来很多朋友私信咨询怎么下载使用数据可视化大屏模板&#xff0c;在这里就给大家做一个相对简单的教程总结。有需要的朋友记得先收藏保存&#xff0c;以便不时之需。 数据可视化大屏制作软件&#xff1a;奥威BI系统 数据可视化报表模板板块&#xff1a;模板秀 主要操作&…

Unity下如何实现RTMP或RTSP播放端录像?

好多开发者问我们&#xff0c;Unity环境下&#xff0c;除了RTSP或RTMP的播放&#xff0c;如果有录像诉求&#xff0c;怎么实现&#xff1f;实际上录像相对播放来说&#xff0c;更简单一些&#xff0c;因为不涉及到绘制&#xff0c;只要拉流下来数据&#xff0c;直接写mp4文件就…

【数据结构】二叉树的链式结构

【数据结构】二叉树的链式存储结构 二叉树的存储结构 typedef int BTDataType; // 二叉树的结构 typedef struct BinaryTreeNode {BTDataType data; // 树的值struct BinaryTreeNode *left; // 左孩子struct BinaryTreeNode *right;// 右孩子 } BinaryTreeNode;二…

跟模型和中间层聊聊:什么是最好的AI原生应用?

软件 2.0 注定会发生&#xff1a;所有软件都值得用神经网络重做一遍。 这个 OpenAI 大神 Karpathy 多年前的预言&#xff0c;指向了今天 LLM 应用层的一个关键问题——如何基于 LLM 能力&#xff0c;设计好 AI 原生应用。 我们看到&#xff0c;应用层的创业者们感到悲观、质疑和…

腾讯发布超千亿参数规模的混元大模型;深度学习与音乐分析与生成课程介绍

&#x1f989; AI新闻 &#x1f680; 腾讯发布超千亿参数规模的混元大模型 摘要&#xff1a;腾讯在2023腾讯全球数字生态大会上发布混元大模型&#xff0c;该模型拥有超千亿的参数规模和超2万亿 tokens 的预训练语料。混元大模型将支持多轮对话、内容创作、逻辑推理、知识增强…

计算机毕设 大数据上海租房数据爬取与分析可视化 -python 数据分析 可视化

# 1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通…

Zookeeper应用场景和底层设计

一、什么是zookeeper Zookeeper是一个开源的分布式协调服务框架&#xff0c;它是服务于其它集群式框架的框架。 【简言之】 有一个服务A&#xff0c;以集群的方式提供服务。只需要A专注于它提供的服务就可以&#xff0c;至于它如何以多台服务器协同完成任务的事情&#xff0c…

(文末赠书)我为什么推荐应该人手一本《人月神话》

能点进来的朋友&#xff0c;说明你肯定是计算机工作的朋友或者对这本书正在仔细琢磨着的朋友。 文章目录 1、人人都会编程的时代&#xff0c;我们如何留存?2、小故事说明项目管理着为什么必看这本书3、如何评价《人月神话&#xff1a;纪念典藏版》4、本书的目录&#xff08;好…

科技资讯|苹果Vision Pro获得被动冷却系统及数字表冠控制界面专利

据patentlyapple报道&#xff0c;美国专利商标局正式授予苹果一项与头戴式设备&#xff08;Apple Vision Pro&#xff09;相关的专利11751366&#xff0c;该设备可以提供被动冷却系统&#xff0c;利用光学组件的表面来管理热量&#xff0c;而不会对用户显示的视觉信息产生不利影…

博客系统(升级(Spring))(四)(完)基本功能(阅读,修改,添加,删除文章)(附带项目)

博客系统 (三&#xff09; 博客系统博客主页前端后端个人博客前端后端显示个人文章删除文章 修改文章前端后端提取文章修改文章 显示正文内容前端后端文章阅读量功能 添加文章前端后端 如何使用Redis项目地点&#xff1a; 博客系统 博客系统是干什么的&#xff1f; CSDN就是一…

【用unity实现100个游戏之10】复刻经典俄罗斯方块游戏

文章目录 前言开始项目网格生成Block方块脚本俄罗斯方块基类&#xff0c;绘制方块形状移动逻辑限制移动自由下落下落后设置对应风格为不可移动类型检查当前方块是否可以向指定方向移动旋转逻辑消除逻辑游戏结束逻辑怪物生成源码参考完结 前言 当今游戏产业中&#xff0c;经典游…

关于HTTP协议的概述

HTTP 的报文大概分为三大部分。第一部分是请求行&#xff0c;第二部分是请求的首部&#xff0c;第三部分才是请求的正文实体。 POST 往往是用来创建一个资源的&#xff0c;而 PUT 往往是用来修改一个资源的。 Accept-Charset&#xff0c;表示客户端可以接受的字符集。防止传过…

YOLOv5:修改backbone为ConvNeXt

YOLOv5&#xff1a;修改backbone为ConvNeXt 前言前提条件相关介绍ConvNeXtYOLOv5修改backbone为ConvNeXt修改common.py修改yolo.py修改yolov5.yaml配置 参考 前言 记录在YOLOv5修改backbone操作&#xff0c;方便自己查阅。由于本人水平有限&#xff0c;难免出现错漏&#xff0c…

python 列表常用方法

python的列表和js的数组是相似的 mylist ["add", "item", "msg", "add", "add", "add"] # 语句[索引] 值 改变列表中某一项的值 # mylist[1] 122 # insert插入值 # mylist.insert(2, "age") # appe…

Vite和Webpack如何使用CDN包

为了精简打包输出的dist目录大小&#xff0c;我们可以引入CDN外部包的方式&#xff0c;来缩小打包的体积&#xff0c;加快打包速度。这里介绍Vite和Webpack中如何引入React CDN外部包。 一、Vite引入CDN包 1、安装插件 npm i vitejs/plugin-react-refresh vite-plugin-cdn-i…

无涯教程-JavaScript - BESSELK函数

描述 BESSELK函数返回修改后的Bessel函数Kn(x),该函数等效于针对纯虚参判断的Bessel函数。 这些也称为双曲贝塞尔函数。 语法 BESSELK(X, N)争论 Argument描述Required/OptionalXThe value at which to evaluate the function.RequiredNThe order of the function. If n i…

深度学习-全连接神经网络-训练过程-欠拟合、过拟合和Dropout- [北邮鲁鹏]

目录标题 机器学习的根本问题过拟合overfitting泛化能力差。应对过拟合最优方案次优方案调节模型大小约束模型权重&#xff0c;即权重正则化(常用的有L1、L2正则化)L1 正则化L2 正则化对异常值的敏感性随机失活(Dropout)随机失活的问题 欠拟合 机器学习的根本问题 机器学习的根…

WebRTC 源码 编译 iOS端

1. 获取依赖工具 首先&#xff0c;确保你已经安装了以下工具&#xff1a; GitDepot ToolsXcode&#xff08;确保已安装命令行工具&#xff09; 2. 下载 depot_tools 使用 git 克隆 depot_tools 并将其添加到你的 PATH 中&#xff1a; /path/to/depot_tools 替换为自己的路径…

正规股票配资网站的三个明显特点分析

随着股票市场的快速发展&#xff0c;越来越多的投资者开始考虑使用股票配资来增加自己的资金流动性和收益率。然而&#xff0c;在选择股票配资网站时&#xff0c;投资者往往难以辨别哪些网站是正规的&#xff0c;哪些网站存在风险。因此&#xff0c;以下将分析正规股票配资网站…