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





