关于整数和浮点数在数据中的存储

整数

关于整数在数据中的存储比较简单,分为有符号整数和无符号的整数,他们的存储都是转化为二进制存储,而首位是符号位,但是在无符号的整型中他不会被识别为符号位,而是当成正常的二进制位运算就会出现图中所示的情况。

我们再顺便提一嘴char类型,因为是一个字节八个比特位,所以会出现整型提升的情况,进而导致他的值可能产生一些变化,比如

按理说应该是产生129这个值,但是为什么会变成-127呢,首先由于长度限制,char最大只能到11111111,这在内存中被识别为-128,如果再+1,虽然会产生进位,但是也超过了本身八个比特位的长度,导致无法计算进去,所以char更像是一个圆,他的值在-128到127之间循环。

再根据上面char的值范围结合上原反补的转换,所以当以整型打印字符类型时会产生整型提升和截断

最后得出它为什么+2不等于129而是等于-127。

浮点数

相比起整数浮点数在内存中就有些抽象了,因为它的存储是按照国际规定的存,首先来说一下规定是什么,浮点数的计算分为三个部分S E M

首先将S乘-1 此时S如果是正数 则S=0 负数则S=1。

再假定一个浮点数9.0,他的二进制表示是1001,用科学计数法表示则是1.001乘上2的3次方,因为是二进制所以以二为底,那么1.001是M,次方3则是E。

浮点数float 32比特位里第一个比特位存的是符号位 中间八个比特位存E 最后23个比特位存M

浮点数double 64个比特位中 第一个存符号位 中间11个比特位存E 最后52个比特位存M

且M的值大于1小于2.

而由于科学计数法可以出现负数,而E不接受负数 ,所以规定了一个中间值 float的中间值是127

double的中间值则是1023 我们产生的E需要加上中间值再写入二进制 ,而M的值小数点前的1将被省略,这样将可以多存入一点数据,在转化后加上小数点前的1即可

那么它在内存中的存放其实是(假设a现在是float类型)

而如果a是整型 那么他在内存中的存放应该是

那么当我们想把一个整型的数用浮点型打印就会出现他的E全0的情况 E为0是特殊情况

此时E将等于1-127(中间值) 而M也将不加上1 这就导致明明我在整型里是个9,到浮点型里就变成了一个无限接近于0的数。

另一种特殊情况则是E全1的情况。此时如果M的有效数字全为0,则表示无穷大,至于是正无穷大还是负无穷大这取决于符号位。

所以关于浮点数的存储,难在他的存储是按照国际标准规定的,如果先弄明白他的规定,再去理解就简单一点,不过还是有的绕,需要多看几遍才能明白。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值