关于数据的储存的简单刨析

本次刨析是位于vs2019的环境下

我们知道,c语言下的数据类型可以分为四类:整型,浮点型,构造类型,指针类型

而今天,我们就来简单了解一下整型和浮点型

首先是整型,既没有小数部分的数据。不同的整型类型,在内存中开辟的空间的大小也不同

如char占1个字节,short占2个字节,int占4个字节等

计算机内的整型的表示方式有三种,分别为原码、反码和补码

我们以int类型为例

int占4个字节,即32个比特位

负整型的原码、反码和补码:

原码:即是将int类型的数据转化为二进制表示形式,而其第一位则是符号位,0代表+,1代表-,剩余比特位则是表示该数据的绝对值的二进制数字

 反码:顾名思义,反码即是符号位不变,其他比特位的数据按位取反

如 ​​​​​​​

  补码:即是反码+1得到补码

如​​​​​​​

 正整型的原码、反码和补码都相同:

 而整型在计算机内的储存形式就是补码

我们发现了一件事,vs2019环境下,

数据的低位储存在了低地址,数据的高位储存在了高地址

而这就是小端存储模式

反之,

数据的低位储存在了高地址,数据的高位储存在了低地址

这就是大端存储模式

了解到以上这些,我们来探究一个问题:为什么说char的范围是-128~127呢?

首先,char是占1个字节,即8个比特位,那么char可表示的数据范围则是00000000~11111111

而我们知道,补码的第一位是符号位,故正整型可表示的数据范围是00000000~01111111,而负整型可表示的数据范围是10000000~11111111,细心的人可能会发现,00000000表示+0,10000000表示-0,并且没有如何一个数据表示-128

在设计反码后,人们发现存在0的符号问题,即00000000和10000000都表示0,故之后人们设计出了补码来解决这一问题,将00000000作为0的补码,而10000000作为-128的补码。

注意:因为10000000是以前-0的补码来表示-128,所以-128在char类型中并没有原码和反码表示

​​​​​​​而其他整型类型的数据也是同样的道理

接下来则是介绍浮点型数据

浮点型数据有float,double,long double

而浮点数在内存中的储存形式与整型不同

以float为例 

存入数据时,符号位为1表示-,符号位为0表示+

而指数位则为一个无符号整型,但我们知道指数位可能是负整型,故我们需要一个中间值,在存入指数位时真实值加上中间值,即可使得指数位为无符号整型

而有效数字计算机存入时,M可改写为1.xxxxxxxx,默认第一位为1,故存入有效数字时,整数部分的1可以省略,只保存后面的小数部分,增加数据的储存范围,等读取数据时,再把第一位的1加上

例如,10.5在内存中的储存形式为01000001000000000000000000000101

而对于浮点型数据的取出,符号位正常取出,而指数位则要分为三种情况

1.E不全为0或E不全为1

这时只需要将指数位的值减去127,就得到真实值,此时有效数字的第一位补上一个1

2.E全为0 

此时E的真实值为1-127,且在有效数字第一位补上一个0,这样做是为了表示±0,以及接近于
0的很小的数字

3.E全为1

如果有效数字M全为0,表示正负无穷大

另外我们需要注意一下指数位的数值范围

在char类型中8个比特位的范围是-128~127

但同样是8个比特位的指数位,其数值范围是-127~128

其原因是E首先是一个无符号整数,它占了8个比特位,当它表示无符号整数时,

它的范围是0~255,但由于E实际上可能位负整数,

故我们通过加一个中间值127使其变为一个无符号整数

​​​​​​​因此,E的真实值的数值范围是-127~128

以上就是float类型数据的存储

以上就是对整型和浮点型数据的存储的简单刨析
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值