C语言 浮点数和整数在内存中的存储 (详解)

本文详细解释了C语言中整数和浮点数在内存中的存储机制,包括整数的二进制表示、符号位处理、补码使用,以及浮点数的IEEE754标准,展示了如何存储和取回5和-5的实例,以及浮点数的有效数字、指数表示和特殊值处理。

相信很多学完C语言的小伙伴们在学习完C语言的一部分后,依旧对整数和浮点数在编译器中的存和取,还不是很理解。那么就让利用本篇文章,为各位好好讲讲!它们分别在内存中是怎么存和取。

整数

整型家族有 short,int,long,long long
整数一共有四种表现形式:
1:二进制(逢二进一) b
2:八进制(逢八进一)O
3:十进制(逢十进一)B
4:十六进制(逢十六进一)H
其中二进制是整数在内存中的存储形式,即所有其他的整数形式都是先变为二进制形式,然后在存放到内存里面。

如果是有符号类型的整数,最的1高位为符号位: 1为负,0 为正 ,其余为数值位。
而无符号类型的整数,全部都是数值位。
这也是为什么 unsigned int (-32768 ~ 32767)和 int(0 ~ 65535)等等取值范围不一样的原因。

讲到二进制,这里还涉及一个 原码 反码 补码的知识:
原码:直接将整数按照正负数的形式翻译成二进制得到的就是原码。
反码:将原码取反,得到反码,如果是负数整数符号位不变,其它位取反。
补码:反码加一,得到补码。

整数在内存中的存

这里以5和-5为例:
这是5存储在内存中,原码,反码,补码的形式
在这里插入图片描述

这是-5存储在内存中,原码,反码,补码的形式
在这里插入图片描述

整数在内存中的取

还是以5和-5为例,取得过程中有两种方式:
1: 先取反,后加1。
2:先-1,后取反。
在这里插入图片描述

使用补码的原因

1:方便符号位和数值位的统一管理
2:其次加法和减法也可以统一计算(CPU只有加法器),不需要额外的电路

浮点数

浮点型家族有:float,double,long double。
浮点数一共有两种表现形式:
正常形式:1.345
科学计数法:1E10
注意:C语言里面 unsigned/signed 不能用于修饰浮点类型
浮点数在内存中的存和取,是通过国际标准IEEE(电⽓和电⼦⼯程协会)754标准制定。在它的规定中讲到,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (−1)^S ∗M ∗ 2E
• (−1)^S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M 表⽰有效数字,M是⼤于等于1,⼩于2的
• 2E 表⽰指数位

例如6.0和-6.0:
6.0 0000 1010
6.0= (−1)^0 ∗1.01 ∗ 2E2

-6.0 0000 1010
-6.0= (−1)^1 ∗1.01 ∗ 2E2

IEE754还规定:
32位的机器中 最高的1位为符号位S,后面的8位为指数位E,剩下的23位为有效数字位M。
在这里插入图片描述64位的机器中 最高的一位为符号位S,后面的11位位指数位E,剩下的52位为有效数字位。
在这里插入图片描述

浮点数在内存中的存

IEE754在浮点数存的过程中还有关于M和E的特别规定:
我们知道M是一个只能在1~2之间的一个数,也就是1.xxxx,所以1就省略不会存储在内存中,只保留xxxx部分,这样就可以多出一位来存放更多的数据。
E是一个无符号整形,如果想要存放负数就不行,这个时候IEEE754就规定了,在32位里E在存入之前要先加上中间数127,用小于127的表示负数,大于127的表示正数,在64位里E在存入之前要先加上中间数1023,用小于1023的表示负数,大于1023的表示正数。

浮点数在内存中的取

指数E从内存中取又分为3种情况:
1:E不全为0或全为1
这时,浮点数就采⽤以下的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1

2:E全为0
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字。
3:E全为1
这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值