C语言笔记20 •整数和浮点数在内存中存储•

整数和浮点数在内存中存储

1.整数在内存中存储

整数在内存中存储比较简单,整数存储分为正整数存储和负整数存储。

对于有符号整数 符号位中0表示正整数,1表示负整数。

正整数在内存中存储:

正整数原码,反码 ,补码都相同。

比如数值1

原码:00000000000000000000000000000001

反码:00000000000000000000000000000001

补码:00000000000000000000000000000001
负整数在内存中存储:
正整数原码,反码 ,补码各不相同。
原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
比如数值-1

原码:10000000000000000000000000000001

反码:1111111111111111111111111111111111110

补码:1111111111111111111111111111111111111
在计算机的内存中,整形数据是以补码的形式存储在内存中的。
为什么 整形数据要用补码存储在内存中呢?
(1)方便实现数值和符号位进行统一操作。
(2)计算机CPU只有加法器,而且补码和原码转化原理是相同的,这样可以简化硬件电路。

2.浮点数在内存中存储

浮点数家族包括: float、double、long double 类型
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:

V = (−1)^ SM ∗ 2^ E
• (−1)^ S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M 表⽰有效数字,M是⼤于等于1,⼩于2的
• 2^ E 表⽰指数位
举例:⼗进制的5.5,
5.5由5和0.5组成
5→101 小数点后的二进制的权值变为2^(-1)、2^(-2)、2^(-3)、2^(-4)...... 所以0.5二进制表示为
0.5→1
即5.5 写成⼆进制是 101.1 ,相当于V=(-1)^0×1.011×2^2
S=0,M=1.011,E=2
IEEE 754规定:
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E的相关值,剩下的23位存储有效数字M
对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E的相关值,剩下的52位存储有效数字M

M存储说明:

IEEE 754 对有效数字M和指数E,还有⼀些特别规定。
M的范围: 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,即8位的E:10001001。

就比如上面的例子:5.5f S=0,M=1.011,E=2

S中存储0
E中存储的相关值是以float为例 2+127=129 8位二进制是10000001
M中存储011 不够23位用0补够也就是 01100000000000000000000
所以5.5在内存中存储的是
01000000101100000000000000000000
对于E有三种情况
(1) E不全为0或不全为1
有一点就是由于规定M的范围: 1 ≤ M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表⽰⼩数部分,比如0.5,二进制表示为:0.1 =1.0*2^(-1) V=(-1)^0×1.0×2^(-1)
所以0.5在内存中存储的是
0 01111110 00000000000000000000000
(2) E全为0
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还 原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字。
0 00000000 00100000000000000000000
(3) E全为1
这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s);
0 11111111 00010000000000000000000

相关推荐
喵叔哟19 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生25 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
hopetomorrow39 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
小牛itbull1 小时前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i1 小时前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落1 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜1 小时前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming19871 小时前
STL关联式容器之set
开发语言·c++
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
美式小田1 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习