数据在计算机中如何存储?
数据在计算机中都是以二进制进行存储的,一个bit也就是一个二进制位只能表示0或者1,能存储的信息太少了,所以8个bit分为一组,称为字节,是计算机中最小的存储单元了。
二进制的原、反、补3种形式。
原码
一个字节的8个bit中,首位称为符号位,只用来表示正负,0表示正数,1表示负数,是不参与计算的,剩下的7位是数值位,用来存储数据,所以一个字节所能表示的数据范围为1111,1111~0111,1111,即-127~-0,+0~127,共256个,但是实际一个字节所能表示的范围却是-128~127,这是为什么呢?学习了补码之后就知道原因了。
下面举一个原码的例子:
56的原码:0011 1000;
-56的原码:1011 1000
反码
当计算-56+1时,使用原码的结果为-57,正确应该是-55啊,所以使用原码对负数进行计算时是有问题的。
那么如何解决呢?
就提出了反码,反码的规则如下:
(1)正数的反码仍是其原码;
(2)负数的反码是符号位不变,每一位二进制位取反。
怎么想到这么天才的解决办法的,真是厉害。
下面是使用反码计算-56+1的过程,要注意到使用反码进行计算的结果仍然是反码,可以转换为原码查看十进制的结果。
补码
当使用反码进行负数的计算时,当计算的结果不大于0是不会出现问题的,当越过0时问题就出现了。
比如-2+3,运算步骤如下:
按说应该是1,但是实际却是+0,与实际结果1相隔了一位。
为什么会出现这种情况呢?
原因就是0在反码中有两种表现形式,分别是+0(0000,0000)和-0(1111,1111),将其变为一种就可以了,实现方式是将-0的反码(1111,1111)+1转变为(0000,0000),这样就与+0的反码相同了,不管+0,-0在计算机中都只有一种表现形式为了。
-1~-127的反码为1111,1110~1000,0000,由于-0的反码(1111,1111)+1转变为(0000,0000),导致现在的反码少了一个1111,1111,这种是不连贯的,在计算的时候还是有问题的,所以-1~-127的反码也都跟着+1,将少的1111,1111给填上。
因此这种定义为补码,补码的规则为:
(1)正数的补码仍是其原码;
(2)负数的补码是反码+1。
会把1000,0000给空出来,所以额外将1000,0000定义为-128的补码,并且-128无原码和反码形式。
在计算机中无论正数还是负数都是以补码的形式进行存储的。