C语言—原\反\补码的真正机制

近来频频接触原反补码,书上的解释是什么呢?
计算机内部在用补码进行计算,正数的原反补都是其本身,负数的补码是除符号位之外全部取反,补码是在反码的基础上加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的计算机内部的补码,不需要再验证了,我们可以认为已经人为规定。
其实到这个地方就可以停下来了,再深究下去,需要结合计算机内部构造去梳理。学疏,文浅,有错望涵。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值