整形与浮点型在内存中的存储

文章详细阐述了整形在内存中以二进制补码形式存储的过程,包括有符号和无符号整形的读取差异。同时介绍了浮点型按照IEEE754标准的存储规则,包括符号位、指数位和有效数字的处理,并通过例子解释了精度丢失的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

整形在内存中的存储

存储方式

例子

浮点型在内存中的存储

浮点数的存储规则

单精度的存取例子

关于浮点数精度丢失问题

总结


整形在内存中的存储

存储方式

整形是以二进制补码的形式在内存(变量)中存储的

例子

 将-1存储到无符号的int中,先由a开辟出一块四字节的空间,在将-1转换成二进制补码,最后再将-1的补码放到a这个变量当中。所以a里存放的内容就是 11111111 11111111 11111111 11111111

// 十进制-> -1 

// 源码-> 10000000 00000000 00000000 00000001 
// 反码-> 11111111 11111111 11111111 11111110
// 补码-> 11111111 11111111 11111111 11111111
   unsigned int a = -1;
//a == 11111111 11111111 11111111 11111111

读的重点在于以何种类型来解读变量a里面存储的二进制补码

有符号整形

若用printf("%d",a)来把a的数据打印到屏幕上,得到的结果将会是-1。

因为在%d看来这里面存放的是有符号数据,那有符号数据先看符号位,符号为是1那便要经行的原反补转换,最后得到的结果自然是-1

无符号整形

若用printf("%u",a)来把a的数据打印到屏幕上,得到的结果将会是4294967295。

因为在%u看来这里面存放的是无符号数据,既然是无符号那里面存放的内容就是有效数据,不需要在经行原反补的转换,直接解读里面的内容

浮点型在内存中的存储

根据国际标准IEEE 754规定任何一个浮点数都可以写成以下形式

(-1)^S  *  M  *  2^E

  • (-1)^S 表示符号位,S是0表示正数,S是1表示负数
  • M 表示有效数字
  • 2^E 表示指数位,二进制的科学记数法

浮点数在内存中空间分配是这样的

对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M

 举个例子

将9.5转换成SME形式

  9.5 
//先将其转化成二进制的形式
  1001.1
//在转换成科学记数的形式
  1.0011 * 2^3  //小数点向左移3位,因为是二进制所以是2 ^3
  (-1)^0        //S为0表示为正数
  (-1)^0 * 1.0011 * 2^3   //这就是SME形式
S = 0 //符号位
M = 1.0011 //有效数字
E = 3  //指数位

浮点数的存储规则

关于S

S是存储在第一个比特位

关于M

由于将M其写成了科学记数法的形式那M就必然大于等于1。所以标准规定在存储的时候 只存储小数点后面的内容,等到读取的时候再把第一位的1给加上去 。

1.0011在存储时只存储0011                      

关于E

首先E为无符号整形,但科学记数法可以有负数。所以标准规定E在存储是要加上一个中间值,当需要读取时在减上这个中间值就可获得真实值。

中间值为E存储空间-1的一半,float类型的E的存储空间是1个字节那么中间值就是127

单精度的存取例子

9.5, S放在最高位,E转换成二进制在加127放在后8个比特位,M放在最后的23个比特位

9.5 
(-1)^0 * 1.0011 * 2^3   //S*M*E形式
S = 0 //符号位
M = 1.0011 //有效数字
E = 3  //指数位
0100 0001 0000  0000 0000 0000 0000 0011       

还原数据 

还原成SME的形式:  S直接取出来,E(正常情况)取出后减去中间值得到真实值,M取出后在第一位放上一个1

E取出的两种异常情况

E为全0                                                                                                            

E还原成1减去中间值,M不需要加上第一位的1,而是还原成小数。这样做是为了表示±0,以及接近于0的很小数字

E为全1

这时,如果M全为0。表示±无穷大(正负取决于符号位s)

关于浮点数精度丢失问题

为什么浮点数在存储时会有精度丢失呢?

(部分)因为小数转二进制得到的数值位太多了,就好比不存一个完美的圆一样只能无限逼近这个数字,无法将这个数字完全表示出来,另一方面存储空间有限会发生截断

如:1.32

1.0101011100001010001111010111000010100011110101110001 ... ...

总结

不管是整型还是浮点型都是先将数据转换成二进制的形式存储到内存当中,在读取的时候根据自身类型与读取类型来“翻译”这串二进制序列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值