C-数据的存储
里面详细介绍了整型跟浮点型的存储,看完认可的话,可否一键三连呢!
数据类型介绍
我们大致分为2类:整型与浮点型
整型:int,char,short,long,long long
浮点型:float(单精度浮点型),double(双精度浮点型)
补充一点,我之前一直在犯错的地方:
float类型的输入(scanf)用“%f”,打印用“%lf”或者“%f”
double类型的输入(scanf)用“%lf”,打印用“%lf”或者“%f”
问:为什么要这么多数据类型?
为了开辟不同的内存空间大小,可以精确控制存在这些空间中的数据
整型在内存中的存储
一个数据它有原码、补码、反码,我们通常操作的是它的补码,存在内存中的也是它的补码
接下来介绍一下怎么实现3者之间的转换:(正数的反码补码是本身,不会改变,负数则要遵循以下原则,且符号位不变(最左边的第一位))
我们举个例子:(a是整型,占4个字节=8个比特位,因此存到a中的只有8个有效数字)
下面我们看负数的:(为了效率,我们就只写前和后的8个比特位)
我们可以验证(每4个二进制位等于1个16进制位)例如:
注意:每4位二进制位转化为一位16进制位
问:为什么要用整型补码进行计算 ?
答:用补码可以将符号位和数值统一处理,避免了正负数符号不同产生影响
我们看个例子:
下面我们仔细演示一遍:(注意都是对补码进行操作啊)
大小端的介绍
其实就是大端存储和小端存储
如果高字节位存储到低地址位,就是大端存储(逆序),否则就是小端存储(顺序)
我们画个图理解:
如何判断当前编译器版本是小端存储还是大端存储?
我们可以写一个代码,看它的内存存储
我们可以看到,在内存中a的存储是f6 ff ff ff
刚好与我们换算的16进制相反,所以我们判断是大端存储
因此,我们可以这么记:顺序为小端,逆序为大端
浮点型在内存中的存储
浮点数的存储与我们的整型存储截然不同,首先我们先看一个公式:
V=(-1)^S * M * 2^E
我们演示以下,帮助理解:
解析:我们拿左边为例
首先5.5是一个浮点数,先转化小数点左边为2进制,再把右边也换成2进制(小数点右边第一位是乘2的负一次方,小数点右边第二位是乘2的付二次方,以此类推),然后再移动小数点进行变换
下面我们重点讲变化规律:
V= (-1)^S * M * 2^E
“(-1)^S”是符号位,S=0时,V为正数;S=1时,V为负数;
“M”是有效数字,范围是1<=M<=2,(在上面的移动小数点就是要移动到M满足这个条件为止)
“2^E” 是指数位,2代表2进制,E代表移动位数(左移是正号,右移是负号)
了解完之后,我们再正式进入浮点数的存储:
明天补充哈,太困了!