对于数据存储的一点总结

计算机里面有许许多多的数据类型。简单来说,可以将复杂的数据类型分为下面五类:整形、浮点数、构造类型、指针类型和空类型。其中,各个数据类型有各个数据类型的字节大小。
*一、整型数据在内存中的存储
1、数据的“存”
需要注意的一点是,我们存数据的时候,和数据类型是没有关系的。因为计算机中任何数的存储形式都是二进制的补码。这里要说一下原码、反码和补码的概念,三种表示方式均有符号位和数值位两部分,符号位是最高位,0的时候表示的是正数,1的时候表示的是负数。原码,直接将数据翻译成二进制即可,反码是在原码的基础上符号位不变,其它位依次取反,补码是反码加1,并且符号位参与运算。正数的原码、反码和补码都是一样的,但是负数的原码、反码和补码就得按照原反补的变换来计算。
知道了原反补的概念,就知道了怎么把一个整数类型的数转换成对应的二进制数,那么,我们就可以进行数据的“存”了。
我们在C中会看到如下的定义:

int a=20;
int b=-10;

其中,对a我们要把20这个值赋给它,首先,由于它是int类型,我们先在栈上开辟4个字节的空间,然后将20转换成二进制,0000 0000 0000 0000 0000 0000 0001 0100,然后再放入开辟的空间中。对于b也是这样,转换成二进制1111 1111 1111 1111 1111 1111 1111 0110,然后再放入其开辟的空间中。
所以,我们可以看到,在存数据的时候,和数据类型没有关系,我们只是把要存的数据变为二进制后再放入其开辟的空间内,数据类型只是起到在内存上开辟空间的作用。
2、数据的“取”
当我们“取”数据的时候,也就是看这个数据的时候,要先看数据类型,然后根据它是什么数据类型再读出它的数据。简单来说,数据的“取”更像是我们看待事物的一个方式,就像是钱一样,100人民币和100美元就不一样,虽然它们都是100,但是加上人民币和美元之后就不一样了。
**一个小知识点-**在取的时候可能涉及到整形提升:

char a=-1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);

此时程序输出的是-1,-1,255。
虽然a,b,c存的时候都是存的1111 1111,但是,输出是按照%d形式输出,所以需要增加到32位,也就是4字节。在自身的基础上增加24位,而添加什么数组和它本身类型有关,如果本身是一个有符号数,前面就都添加符号位,如果是一个无符号数,前面就添加0。a前面的24个数字都添加1,b前面24个数字也都是添加1,c前面24个数字添加0。然后再根据%d读取,由于是有符号整形,所以先看符号位,a和b的符号位都是1,所以需要补码转换,转换成原码之后,再翻译成十进制数,就是-1,而c由于符号位是0,所以不用补码转换,直接翻译成十进制数,就是255。
二、浮点数的存储
浮点数的存储要比整形的存储简单。首先我们先要把一个数翻译成二进制形式,然后按照科学计数法的形式写表现,根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201122171344916.png#pic_center其中,S是符号位,当S=0时,V是正数,当S=1时,V是负数。M为有效数字,大于等于1,小于2。E表示指数位。
单精度浮点数存储模式如下图:
在这里插入图片描述

双精度浮点数存储模式如下图:
在这里插入图片描述
有效数字M一定是一个1.XXXX…的形式,所以M只需从左到右存上XXXX…,剩余数字补零即可。
对于E而言,存入数据时必须要加上一个中间数,对于8位的E而言,中间数是127对于11位的E而言,中间数是1023。在存入E的时候要加上中间数,在取出E的时候要减去中间数。
所以浮点数的存储可以看作下图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值