数据的存储

news2024/12/23 5:12:55

数据的存储

文章目录

    • 数据的存储
  • 一、数据类型
  • 二、整形在内存中的存储
    • 2.1 原码、反码、补码
    • 2.2 大小端介绍
    • 2.3几个经典关于内存存储的例子
  • 三、浮点型在内存中的存储
    • 3.1 一个令你惊呆的例子
    • 3.2 浮点数存储规则

一、数据类型

整形家族:
char: unsigned char, signed char
short: unsigned short , signed short
int: unsigned int, signed int
long: unsigned long , signed long
浮点型家族:
float,double
构造类型:
数组类型
结构体类型 struct
枚举类型 enum
联合类型 union
指针类型
int* pi;
char* pc;
float* pf;
void* pv;
空类型:
void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型.

二、整形在内存中的存储

2.1 原码、反码、补码

原码:把任何数按照正负数的形式写成它的二进制序列就是它的原码。(对于正数和无符号整数,它的原反补码都是相等的)

反码:符号位不变,其他位依次按位取反得到反码。

补码:反码+1得到补码。
(只有负数的原码反码补码需要计算得来,所以反码和补码只对负数而言,因为正数和无符号整数原码反码补码都是一样的,不需要通过计算得来的。)
补充:
1、符号位为0表示正数,为1表示负数。
2、对于整形来说:数据存放内存中其实存放的是补码。(因为CPU只能进行加法,而用原码计算得到的结果是不对的,补码计算得到的结果是正确的,具体证明如下图所示)
在这里插入图片描述

2.2 大小端介绍

什么是大小端?
大端(存储)模式,是指数据的低 (权值) 位保存在内存的高地址中,而数据的高 (权值) 位,保存在内存的低地址中;
小端(存储)模式,是指数据的低 (权值) 位保存在内存的低地址中,而数据的高 (权值) 位,保存在内存的高地址中。
(口诀:小小小端,其余大端)

2.3几个经典关于内存存储的例子

int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d\n", a, b, c);
	return 0;
}

这个打印的a,b,c是多少呢?让我们来分析一下。
在这里插入图片描述

int main()
{
    char a = -128;
    printf("%u\n",a);
    return 0;
}

这个呢?

int main()
{
	char a = 128;
	printf("%u\n", a);
	return 0;
}

这个?
在这里插入图片描述

int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
	return 0;
}

这个?
在这里插入图片描述

unsigned int i;
for(i = 9; i >= 0; i--)
{
    printf("%u\n",i);
}

在这里插入图片描述

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

这个?
在这里插入图片描述

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

3.1 一个令你惊呆的例子

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

你认为这个代码的结果是多少?
在这里插入图片描述
这个答案出乎你的意料吧!!!
那么这是为什么呢?
想要知道这是为什么,就需要我们了解浮点数在内存中的存储规则了。

3.2 浮点数存储规则

根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^S * M * 2^E
(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位。

举个例子:
十进制的5.0,写成二进制是 101.0 ,相当于 1.01×2^2 。
那么,按照上面V的格式,可以得出S=0,M=1.01,E=2。
十进制的-5.0,写成二进制是 -101.0 ,相当于 -1.01×2^2 。那么,S=1,M=1.01,E=2。

IEEE 754规定:
对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
在这里插入图片描述

对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
在这里插入图片描述

IEEE 754对有效数字M和指数E,还有一些特别规定。
前面说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。
IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

对于E:
首先,E为一个无符号整数(unsigned int)
这意味着,如果E为8位,它的取值范围为0-255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即
10001001。
然后,指数E从内存中取出还可以再分成三种情况:

一、E不全为0或不全为1
这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
比如:
0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:0 01111110 00000000000000000000000

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

三、E全为1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)。

以上就是浮点数的存储规则。

现在就可以很好地解析上面那个例子的结果了。
第一个数据以整数的形式放进去,第二个printf是以浮点型的规则拿出数据并打印出来。
因为9的二进制序列为:0000 0000 0000 0000 0000 0000 0000 1001
由于S位后面的8位全为0,即E全为0,所以这个浮点数就写成了:
V=(-1) ^ 0 * 0.00000000000000000001001*2 ^ (-126)=1.001×2^(-146)
这是一个非常小的数字,可以直接认为这个数就是0了,所以第二个printf打印出来的就是0.000000。

第二个数据就是以浮点型的形式存进去,第四个printf是以整形的形式打印出来。
按照浮点数的存储规则:
浮点数9.0等于二进制的1001.0,即1.001×2^3
那么,第一位的符号位s=0,有效数字M等于001后面再加20个0,凑满23位,指数E等于3+127=130,即10000010。
存进去的数据是 0 10000010 001 0000 0000 0000 0000 0000
所以第四个printf就是把这个二进制序列以整形的形式打印出来就是1091567616啦!

你清楚了吗??欢迎点赞评论哈!

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

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

相关文章

redhat9---MySQL8练习

目录 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工资和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表&#xff0c;名为工作日…

anaconda 常用命令

在windows winR cmd中运行 或者在 linux的终端terminal中运行 1.查看conda版本 conda --version 2.查看conda现有源 conda config --show-sources 添加国内清华源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config…

谷粒学院——Day16【统计分析】

❤ 作者主页&#xff1a;Java技术一点通的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是Java技术一点通&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得关注、点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习&#xff0c;共同进步&#xff01;&am…

会通转债,大元转债上市价格预测

会通转债基本信息转债名称&#xff1a;会通转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;8.3亿元。正股名称&#xff1a;会通股份&#xff0c;今日收盘价&#xff1a;8.61&#xff0c;转股价格&#xff1a;9.33。当前转股价值 转债面值 / 转股价格 * …

知识管理在商业模式创新中的重要性

我们生活在一个以知识为基础的经济中&#xff0c;与实物资产相比&#xff0c;数据和信息被认为是宝贵的资产。组织正在收集更多的数据&#xff0c;并对其进行处理&#xff0c;以转化为可操作的洞察力。这些洞察力是商业决策和推动战略举措的有力工具。这些洞察力需要被捕获并在…

智慧农业大田解决方案LoRa的LPWAN低功耗广域网无线通信SoC芯片ASR6601

智慧农业大田解决方案利用传感设备、自动化控制设备、气象站实时监测采集田间土壤墒情、气象信息、作物长势信息&#xff0c;主要包含气象监测系统、土壤监测系统、虫情监测系统、水肥一体化智慧灌溉系统、专家服务系统、农产品溯源系统。智慧农业大田解决方案可以准确掌握大田…

C语言—— 表达式求值

C语言—— 表达式求值一、隐式类型转换二、 整型提升三、 算术转换四、操作符的属性表达式求值的顺序一部分是由操作符的 优先级和结合性决定。同样&#xff0c;有些表达式的操作数在求值的过程中可能需要转换为其他类型。一、隐式类型转换 C语言的整型算术运算总是至少以缺省…

通达信股票接口的开源性及兼容性好吗?

通达信股票接口的开源性及兼容性好吗&#xff1f;刚开始炒股的时候&#xff0c;我用同花顺mac版本&#xff0c;界面非常新鲜和简单&#xff0c;然后因为我的朋友是量化的&#xff0c;然后强烈建议使用通达信&#xff0c;小编觉得通达信的开源性及兼容性堪称完美。可以同时兼容&…

拉伯证券|突然崩了!传闻空袭,2000亿“果链”巨头暴跌

1月4日&#xff0c;“果链”龙头立讯精细开盘跳水&#xff0c;一度大跌近9%。到午间收盘&#xff0c;立讯精细股价跌8.38%&#xff0c;总市值为2055亿元。苹果概念股普跌&#xff0c;东山精细跌9.11%&#xff0c;舜宇光学科技跌9.18%、高伟电子跌7.82%、比亚迪电子跌4.30%。 消…

Linux操作系统(常见命令)学习笔记(1)

Linux管道命令 管道命令大致指的是将上次命令返回的结果交给下个命令处理 command1 | command2Linux文件目录指令 ls命令 # 列出当前文件夹下面的文件 ls -params&#xff1a;-a 列出所有文件&#xff0c;包括隐藏的文件-l 以列表的形式列出-h 将文件以/1024后的文件大小显示…

面试官:请实现Javascript发布-订阅模式

简介 发布-订阅模式又叫做观察者模式&#xff0c;他定义了一种一对多的依赖关系&#xff0c;即当一个对象的状态发生改变的时候&#xff0c;所有依赖他的对象都会得到通知。 回忆曾经 作为一名前端开发人员&#xff0c;给DOM节点绑定事件可是再频繁不过的事情。比如如下代码…

拉伯证券|港股站上“年线”,更有盘中暴涨160%!A股地产板块集体大涨

今天上午&#xff0c;A股首要指数涨跌互现&#xff0c;“地产链”股票团体大涨。 港股方面&#xff0c;恒生指数和恒生科技指数盘中双双站上年线&#xff0c;多头攻势微弱。 港股盘中再现异动个股&#xff0c;有港股盘中暴升约160%。 A股首要指数涨跌互现“地产链”股票团体大…

Web3中文|年终回顾:2022年加密市场六大黑天鹅

2022年对加密货币和NFT来说是一段艰难的旅程&#xff0c;随着市场情绪的普遍低迷以及加密寒冬的到来&#xff0c;Web3跌入谷底。 从rug pulls骗局到NFT价格大跌&#xff0c;再到加密交易所和对冲基金的崩溃&#xff0c;还有数十亿美元化为泡沫&#xff0c;政府部门的监管和刑事…

如何使用 LightningChart 创建 JavaScript 散点图?

LightningChart JS是一款高性能的JavaScript图标库&#xff0c;专注于实时数据可视化&#xff0c;以“快如闪电”享誉全球&#xff0c;是Microsoft Visual Studio数据展示速度最快的2D和3D图表制图组件&#xff0c;可实时呈现超过10亿数据点的海量数据。LightningChart .JS | 下…

网络舆情监测服务系统技术说明,日常网络舆情监测记录?

随着互联网快速发展&#xff0c;网络舆情监测服务系统技术可以实现对互联网信息的全面监控&#xff0c;具备敏感词监控、图片识别、预警推送、舆情浏览、综合分析、事件分析、小视频监测等功能。接下来TOOM舆情监测带您简单了解网络舆情监测服务系统技术说明&#xff0c;日常网…

云开发 | 云数据库的创建及其增删改查

前言 虽然说微信云开发开始收费了&#xff0c;不过使用起来确实方便&#xff0c;针对于数据量不大&#xff0c;轻量级的小程序应用来说&#xff0c;云开发包含云数据库、云函数、云存储这三大功能&#xff0c;使用云开发完全可以进行独立开发&#xff0c;甚至不需要依赖于后端。…

worepress 优化记录

关闭评论和头像禁用不必要的插件参加插件。背字根/WordPress小工具 - 码云 - 开源中国 (gitee.com)smalltool 文件夹上传到 /wp-content/plugins/smalltool 下使用缓存WP RocketWP火箭- 帮助提高页面加载速度并减少服务器负载。 高下载速度&#xff0c;反过来&#xff0c;降低了…

数据结构教程

数据结构教程数据结构数据结构与算法为什么要学习数据结构和算法&#xff1f;阅读本教程前&#xff0c;您需要了解的知识&#xff1f;常见的数据结构常用算法插入排序希尔排序归并排序随机机化快速排序双路快速排序三路排序算法排序算法衍生问题堆堆的基本存储堆的 shift up堆的…

DAISY : Linux 上可服务于视力缺陷者的福音

导读如果你是盲人或像我一样有视力障碍&#xff0c;你可能经常需要各种软硬件才能做到视觉正常的人们视之为理所当然的事情。这其中之一就是阅读的印刷图书的专用格式&#xff1a;布莱叶盲文&#xff08;Braille&#xff09;&#xff08;假设你知道怎样阅读它&#xff09;或特殊…

ThinkPHP 加载自定义扩展文件

很久没有用过TP了&#xff0c;自定义扩展文件怎么加载的都不太清楚了&#xff0c;重新捋一遍&#xff0c;记录一下。 ThinkPHP版本 ^6.1.0 目录 1.将自定义扩展文件放入extend 2.设置类文件命名空间 extend下直接是类文件&#xff0c;不需设置命名空间 有层级的类文件&…