数据存储的真面目(上篇)

你知道数据类型可以用来干什么吗?对,就是用来声明变量的;而且呀,声明的变量所占内存空间的大小是根据数据类型来决定的。例如:int a = 100;C语言规定int类型占用4个字节的空间,所以这个100就存储在这4个内存单元中了。

那  你知道这个100在内存中是如何存储的吗?啥!不晓得?嘿嘿,那还不跟着小编往下一探究竟。

对于数据在内存中的存储,我们只探讨整形数据浮点型数据在内存中的存储;啥,你问我why?这个嘛,别的我也不会(嘿嘿)。废话不多说,上干货。

对于计算机而言,无论啥子数据,在他看来,无非就是0或1组成的二进制序列,但对于我们人类而言,最常用的便是十进制数字;嗯,我想说什么来着呢?噢,我想说的是,“不同的进制只是数据的不同表示形式而已。”例如:十进制的8,用二进制表示就是 1 0 0 0(不 准 读 成一千!!!),二进制的1 0 0 0用十进制表示就是8;相信厉害的你肯定知道是怎么得来的!所以,要存储数据,首先要把数据转换成计算机能够识别的形式(二进制形式)。

那 咱们先来探究一下整形数据在内存中是如何存储的吧!想要弄懂这个点,只需要问自己两个问题;question 1:整形数据在内存中存的是什么?question 2:整形数据在内存中怎么存?  嗯,你知道答案吗?不知道的话也没关系,小编将带着大家识别庐山真面目。(兄弟们,给我冲!!!)

首先,计算机中的整数有三种二进制表示方法,分别是原码,反码,补码。所谓的原码就是直接根据数值写出来的二进制序列,正数的原码,反码,补码相同,负数的反码和补码是要根据原码计算得到的。那怎么计算呢?原码的符号位不变,数值位按位取反得到的就是反码;反码+1得到的就是补码。(answer 1:整数在计算机中是通过补码来计算的,在计算机中存储的也是补码)额 小编说了这么多好东西,相信各位看官已经馋的流口水了吧?嘿嘿,上菜!

你一定好奇8的原码是怎么写出来的以及看到的数据为什么是反的呢?莫急,且听我娓娓道来,因为a是int类型,创建a变量的时候向内存申请了4个字节的内存空间,一个字节等于8个比特位,4个字节就是32个比特位,也就是32个0或1组成的二进制序列;还记得上面说的吗?十进制的8表示成二进制就是1000,显然不够32个比特位,那怎么办呢?补0;往哪补呢?要想不改变二进制1000表示的值,只能往前面开始补(看官自己想想why?  提示:涉及二进制各个位的权值);又因为8是正数,最高位为0,所以写出的8的原码就是这样的喽。 至于看到的数据为什么是反的呢?涉及到第二个问题,咱们后面说。

这时,你肯定又要问了,8是一个正数,原码、反码、补码相同,这咋能说明存的是哪个码呢?嗯,有道理; 那咱  换菜!

 嘿嘿,这道菜可符合看官胃口?可以看出整数在内存中存的确实是数据的二进制补码。既然咱有原码了,又为什么要弄出个补码呢?因为通过原码计算会出错,而补码不会(这里就不得不佩服科学家们的智慧了,他们是怎么发现数据的补码的?又是怎么知道通过补码计算不会出错的呢?,而且使用补码,符号位也可以计算。嗯,那就再上一道菜吧!

庐山的真面目已经识得一半了哦,什么!你想休息?嗯,要不,再坚持一下?好嘞,就这么愉快地决定啦!

你还记得第二个问题吗?(整形数据在内存中怎么存?)其实数据在内存中的存储方式多种多样,但不管怎么存储,都要能通过一定的方法取出对应的值。例如:我们想把int类型的数字 0x11223344 存入内存中,有下面这些存法(只举出大概的例子,实际上可能有更多的存储方法)补充:一个内存单元的大小是一个字节,两个十六进制数字可以填满一个字节的空间,所以下面的11占用一个字节的空间,22 33 44也是各占用一个字节的空间。 

但是随着时间的推移,由于前两种存储方法具有一定的优势,便保留下来了,后面的一些存法便淘汰了。像第一种把数据高位的内容放在内存的低地址处,把数据低位的内容放在内存的高地址处的存储方法叫做大端存储模式,像第二种把数据低位的内容放在内存的低地址处,把数据高位的内容放在内存的高地址处的存储方法叫做小端存储模式。因此,咱们之前看到的数据的二进制补码在内存中是反着的原因,就是因为小编的电脑采用的是小端存储模式。哦,对了,存储模式的差异是由机器决定的。总结一下吧,整形数据在存储的时候,电脑就把对应的数据转换成二进制补码的形式按照一定的存储模式存入内存空间里头;说到这里,第二个问题的答案我们也就清楚啦!

对于浮点数在内存中的存储,咱们下篇聊!

眼过千遍不如手过一遍,自己动手试试吧!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值