本次刨析是位于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类型数据的存储
以上就是对整型和浮点型数据的存储的简单刨析