计算机实现减法学习心得

  前面我们知道了人们利用电子电路知识实现了加法,那么要实现减法是不是也要重新设计一套电路器件呢?答案是不用的,因为在计算机二进制里实现减法实际上是通过加法来实现的,例如计算a-b就是计算a+(b的补数),这样利用加法就实现了减法,有点类似十进制的a-b=a+(-b),即相当于减一个数就等于加他的相反数,其实二进制减法也是加上相反数,只不过这里用二进制的补数来表示一个负数。

  十进制里表示一个负数,我们只需要简单的在这个数前面加一个负号即可,但是二进制里你怎么加个负号啊,又怎么表示一个负数呢?所以这里要转换一下,我们知道一个数加一个他的相反数会等于零,例如 1+(-1)=0, 1的二进制是0000001,也就一个数加 00000001 后等于 0,那这个数就是1的二进制相反数,这里叫补数。

--------------------------------------------------------------------------------------------------------------------------------

      00000001

   +   ????????          =   求出这个?数是11111111   , 这个数也就是0000001的相反数,即补数。

   =  00000000

--------------------------------------------------------------------------------------------------------------------------------

那么我们怎么能求出一个二进制数的补数呢?

  只要把要转换的数每一位取反,即0就换成1,1就换成0,这个在电路里也很容易实现,通电的就断开,断开的就通电,  00000001 取反  ->  11111110  , 取反后再加1 -> 11111111 ,这样就求出一个数的补数了,是不是很简单。根据这个规则求得的补数和原来的数相加都会变成0,这个和10进制里的相反数一样。

  知道了补数,和补数在加法里面的作用,来看看负整数的二进制表示,我们规定最高位为符号位,在这个符号位放1就表示是负整数,符号位放0就表示是正整数

比如前面的 11111111 最高位是1,那么这个数就是负数,只不过刨去符号位,剩下的数不能直接转成正数,而是要取反加1,比如 刚刚的 1111111 去掉符号位,还剩7个1,111111 = 127 这样算刚刚的数就变成 -127了,这么算是错的,我们要按取反的方法来推出负数,在通过符号位判断出这个数是负数后,取反加1即可。

  现在又有新问题了,如果 1111111 既可以表示十进制的 256 又可以表示成十进制的 -1 ,那么计算机怎么知道这个是正数还是负数呢,直接把111111丢给计算机,计算机当然不知道这是正数还是负数,所以丢给计算机这串数值时,我们要提前定义一下变量类型,也就是要告诉下计算机这是什么类型的数,这也就是为什么我们在C语言里定义变量要给定变量类型的原因,试想,你不告诉计算机变量类型,他都不知道这是数字还是经过ASCII码表转换后的字符串,当然正数还是负数也分不清了。C语言里有 unsigned short类型,如果给定这个类型,计算机就知道你给定的数是按正数来处理,诸如刚刚的 11111111补成16位的 unsigned short类型就变成了 0000000 1111111,这就是 256。如果把这个数定义成short类型,计算机就会把最高位当作符号位 ,刚刚的 111111会补成16位的 1111111 1111111,这个类型的变量如果最高位是1 ,就是负数了。

  因为16位unsigned short的变量类型,不用空出一位来表示符号位,所以unsigned short的取值范围就是 0 ~ 65535,(2的16次方-1)

      32位的 short的变量类型需要空出一位当符号位,所以只剩15位来存数据,那2的15次方=32768 ,因为负数不用把0考虑进去,所以负数范围是 -32768 ,正数是 32767。在学习计算机前,对计算机的印象总是计算机计算很快很快,计算机能算出很大很大的数,这样看看,如果程序员写程序时没有给定合理的变量的话,计算机的计算能力也很有限啊。

原文地址:https://www.cnblogs.com/luckylihuizhou/p/6351351.html