昨晚苦思冥想了一夜,终于把补码搞懂了。
要想学习计算机,那么第一步就是必须弄懂,计算机中是如何存储数据的。首先计算机中只能存0 1这样的二值数据是众所周知的。
那么下面我想谈一谈计算机中是如何存储整数数据的。在此之前我所见过的所有教材都是说计算机是以补码形式存储的。那么这句话
对不对?答:错,错的体无完肤。
1,模的概念:
什么叫做模,我给模下个定义就是:在一定存储空间中,所能表示的所有数值的个数。
2,补码的概念:
什么是补码?我先以时钟来说明一下。以十二进制论,那么时钟上的时针能表示0、1、2、3、4、5、6、7、8、9、10、11,这些时刻。
所以它的模是12.假如时针现在指向7点,要想把它调为指向3点,该怎么办呢?有两种方法,第一种就是逆时针拨4格,即7-4=3.第二种方法是顺时针拨8格,即7+8=15,由于时钟只能表示十二个数,所以时针实际指向的是15%12=3.%为求余运算符,就是求15除以12的余数。那么我们现在可以得出一个结论:7-4=(7+8)%12。这里我们称4和8互为补码。如果说4是原码,那么8就为4的补码,如果说8为原码,那么4就为8的补码。两个补码之和就等于模(4+8=12)。在这里我们发现4和8都是大于等于零的。所以我们要强调的是只有正数才有补码。负数没有补码。并且得出计算补码的方法就是用“模减去源码得到补码”。那么下面我们来看计算机中的二进制表示:
假如字长为四位,那么它的模就是2的4次方,即16.那么无符号数3在计算机中如何表示呢:答案是:0011,我们看到计算机就是用原码来存储无符号数字3的。所以开头说计算机使用补码来存储整数是错误的。无符号数4在计算机中的表示为0100,我们来看计算机做加法运算3+4是怎么做的:0011+0100=0111结果为7,完全正确,那么再看减法:3-4:0011-0100=1011结果为11,结果就错了,因为无符号数不能表示负数。下面我们在看有符号数。仍然假设字长为4位。我们用最高位表示符号位:+3位0011;+2为0010;加法:3+2:0011+0010=0101=+5,结果正确;再看减法:2-3:0010-0011=1111,结果为-7,答案是错的。我们知道答案应该为-1,即1001.那么为什么会出去呢?应为计算机将符号位一起参加运算了。为了解决这个问题,我们不让计算机中出现负数,如果只有整数就不会产生错误了。那么怎么办,我们知道2-3=(2+13)%16,即将这个3用它的补码来表示。那么15的表示是1111,也就是1的补码。转换成我们能识别的就是-1(最高位表示符号位)这下就正确了。这就是计算机中为什么要用补码表示的原因了。在C语言中我们知道“-”是一个负号运算符,我们就这样理解,它的作用就是将它后面跟的数字求补码,然后存放到计算机中。所已在计算机中只做加法运算。