当前位置:网站首页>【数据存储精讲】整型和浮点型有什么区别?为什么会精度丢失?
【数据存储精讲】整型和浮点型有什么区别?为什么会精度丢失?
2022-08-10 17:43:00 【tt142】
写在最前:
计算机最擅长计算二进制,是因为很多硬件都是二进制的,就好比人最擅长十进制,因为人有十根手指。
最本质的二进制计算规则都是在补码上进行的,关于原反补的计算简单来说
具体在https://blog.csdn.net/weixin_71138261/article/details/126054557?spm=1001.2014.3001.5501 这篇我的博客里面
目录
1.首先来讲无论整数还是浮点数的存储规则
众所周知,创建变量的本质就是在内存中开辟空间,变量就是用来存放数据的,就好比饭菜要用容器盛装
在把数据放到空间之前,首先要把十进制转换成二进制,究竟写成多少个比特位的形式还是以32个最好,但不是必须,因为数据是多少个字节无所谓,他现在只是一个数字而已,就好比我有100个钱,没有说人民币还是美金一样。
但是一旦补码准备好要放入内存就要根据变量类型来选择最多能放入多少个字节
存:
int a=10;
比如这里
数据10的二进制该怎么转换?
十进制二进制相互转换的小技巧:
第一步 把要转换的数字写成二的次幂的和 :10=8+2
第二步 二的几次幂就对应1后几个0 如果有的位被修改成1也没关系,同样也算一位
8=2^3——>1000, 2=2^1——>10
第三步 在二进制的一串0上,从低位开始数0,改成1
00000000 00000000 00000000 00000000 (以32个比特位为例)
00000000 00000000 00000000 00001010 (原码,但是原反补相同)
所以10的补码准备完毕
现在放入内存空间
2.整型
int a为10准备了4个字节32比特位的空间,如果刚才你写的比特位数不够,前面补充0
然后看是否是signed(不特殊写默认是),是就在符号位对应修改,不是就全补0
char b = -1
//b:10000001
int a = -10
//a:10000000 00000000 00000000 00001010
unsigned char c=-5
//c:00000101
当不同类型相互转换的时候会发生整型截断
int main()
{
int a = -10; //11111111 11111111 11111111 11110101
char b = (char)a; //强制截断从低权值位开始 变成111110101
printf("%u", b);//无符号整型打印,所有位都是数值位
}
最后结果根据和计算器算都是正确的
如果对隐式转换和整形提升还不清楚可以看我的这篇文章
https://blog.csdn.net/weixin_71138261/article/details/126071887?spm=1001.2014.3001.5501
这一部分
3.浮点型
浮点型的规则和整型完全不同
根据IEEE 754 规则 任何一个浮点数都可以分为3部分:(-1)^S*M*2^E
S的值是0 / 1如果是正数就是0,负数是1
M*2^E是科学计数法,1<=M<2
比如 5.5——>对应二进制101.1
原因如下
1 1 1 . 1 1 1
2^2 2^1 2^ 0 . 2^-1 2^-2 2^-3
所以101.1=(-1)^0 * 1.011 * 2^2
所以S=0,M=1.011 ,E=2
对应在内存中
float 单精度浮点数4字节
double 双精度浮点数 8字节
【注】:规定特别要求
M 为了可以多存储一个小数位,由于M一定比1大比2小,所以规定计算机默认储存整数位的1,而M只保存小数点之后
E是无符号整型
如果E是8个比特位,范围是0~255,如果是11比特位,范围是0~2047
但是科学计数法是可以有负数的 ,为了规避这个个问题,放入内存时E的真实值必须加上127/1023这两个中间数,8位+127
比如2^10(float),E的真实值是10+127
E全为0
此时浮点数的指数=1-127/1-1023
有效数字M不再加上1,而是还原真实的小数,为了表示+-0和很接近0的小数
E全为1
此时有效数字M全是1,表示正负无穷(因为正负号取决于S和M E无关)
当发生截断的时候就会造成精度丢失
理论结束,会了吗?来看一下这道练习题吧
int main()
{
int n = 9;
float* p =(float*) & n;
printf("%f\n", *p);
*p = 9.0;
printf("%d\n",n);
}
一句话总结:
存:字面数据转补码,放入空间中,符号位取决于数据本身有无符号和变量类型无关
去:先看变量类型 signed确定原反补,unsigned直接存,所有比特位都是数值位
创作不易,感谢观看
边栏推荐
- Making Pre-trained Language Models Better Few-Shot Learners
- LeetCode 0640.求解方程:过几天就看不懂了的迷惑性代码,但是是详解
- 不止跑路,拯救误操作rm -rf /*的小伙儿
- Wuling Hongguang MINI EV, the only drawback is safety
- Talk about cloud native data platform
- 产品-Axure9英文版,A页面内a1状态跳转B页面的b2状态,(条件跳转状态)
- Toronto Research Chemicals农药检测丨Naled-d6
- 1001 A+B Format (string processing)
- dedecms支持PowerPoint粘贴
- R语言patchwork包将多个可视化结果组合起来、plot_annotation函数以及tag_level参数将组合图用大写字母进行顺序编码、为组合图的标签添加自定义后缀信息(suffix)
猜你喜欢
随机推荐
「企业架构」什么是Zachman框架?
微信小程序富文本标签rich-text
img转base64
五菱宏光MINI EV,唯一的缺点就是安全性
Your local docbook2man was found to work with SGML rather than XML
skywalking vulnerability learning
验算移位距离和假设的通用性
2021强网杯
DGIOT平台实时展示OPC上报数据全流程代码剖析
AVFrame相关api内存管理
skywalking漏洞学习
函数柯里化(curry)
基于AWS构建云上数仓第二步:AWS常见服务简介
轮询以及webSocket与socket.io原理
【2015】【论文笔记】等离子光混合器THz辐射的光谱——
【接入指南 之 直接接入】手把手教你快速上手接入HONOR Connect平台(上)
施工企业数字化转型解决方案设计思路
R语言patchwork包将多个可视化结果组合起来、plot_annotation函数以及tag_level参数将组合图用大写字母进行顺序编码、为组合图的标签添加自定义后缀信息(suffix)
欧洲核子研究中心首次在量子机器学习研究中取得实效
烟雾、空气质量、温湿度…自己徒手做个环境检测设备