近来频频接触原反补码,书上的解释是什么呢? 计算机内部在用补码进行计算,正数的原反补都是其本身,负数的补码是除符号位之外全部取反,补码是在反码的基础上加1。如果真正想要去进一步他们之间的关系,其实这个定义可以细分为更多几个小问题。 1.反码存在的意义是什么? 首先,我们需要知道的是,我们现在假设的是,两个八位的带符号的数字的运算。现在假设为3+5,也就是0 0000011+ 0 0000101。现在是两个正数在进行运算,我们输给计算机的是3和5,计算机内部得到的命令是两个正数,那么直接进行相加,0 0000011+ 0 0000101=0 0001000,也就是我们看到的结果8。 很好,如果是只进行正数之间的运算我们甚至完全不需要知道有什么反码,补码的定义。 但是,现在问题来了,如果是3-5呢?很遗憾的是计算机内部并没有减法电路,减法电路设计起来难度也不大为什么不要呢?那计算机就不能算减法了吗?那显然不可能。 于是,我们的反码就出现了。它可以在没有减法器的情况下把3-5认为是3+(-5)。比如-5的补码是1 11111011,3+(-5)也就是0 0000011+1 11111011=111111110,-2。 2.补码存在的意义是什么? 那其实这个时候又会出现一个问题,既然反码已经解决了,计算机没有减法器的问题,为什么还要有补码这种东西的存在呢? 如果我们现在看一个八位的含符号数的话,你会发现我们按照数字构成的规则会出现两个0,一个正0,一个负0。显然这种情况是不允许存在的,计算机内部只能允许有一个0的存在,那怎么办呢,我们规定将负数那一侧的数字全部都移一位,那么那么原来的负0也就变成了-1。所以也就有我们所看见的负数区域变成了-128—-1。 3.计算机内部具体是怎么进行计算的? 还是拿刚刚的例子,其实这里最容易让人混乱的就是,比如我们在读111111111的时候,会按照它是原码去读,如果是原码11111111也就是-127,但是通常情况下我们把它叫做-1,不是-127,如果拿正数那块的构成标准来认识的话,也就是我们人的标准,其实它就是-127,但是我们现在是在让机器进行计算,机器是要把把11111111的反码再加1认为是-127的,也就是10000001是-127。 简单来说,一个值11111111,它本来是-127,机器要求把它的反码加1设定为-127,所以它变成了,10000000,又变成了10000001,所以10000001变成了我们约定俗成的-127。 还有就是10000000,这里我们一看原码,-0(其实已经不存在这个值了),反码加1,11111111再加1,看起来是无法计算了,这也从侧面印证了,我的计算机内部设计上是将0—-127移了一位的。 简而言之,1000000这个时候就是-128的计算机内部的补码,不需要再验证了,我们可以认为已经人为规定。 其实到这个地方就可以停下来了,再深究下去,需要结合计算机内部构造去梳理。学疏,文浅,有错望涵。
|