最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

计算机中的负数表示,原码、反码、补码原理

编程开发 4750浏览 0评论

计算机中数字都采用二进制来表示,正数容易理解,那么负数怎么表示呢?这里涉及到原码,补码和反码的知识,咋一看可能毫无头绪,但是只要记住计算机中有符号数都是用补码形式表示的这句话,后面理解起来就不难了。

先来理解下8位二进制数表示原理。从而可以延伸到32位,64位以及任意其他位数。

8位二进制正数表示范围

0000 0000 ~ 1111 1111
(0 ~ 255)

这个不难理解,那么如何表示负数呢?设计计算机的人就想,把最高位作为符号位,0表示正数,1表示负数。这样,8位二进制数表示范围就发生了变化:

负数:1 111 1111 ~ 1 000 0000 
    (-127 ~  -0)
正数:0 000 0000 ~ 0 111 1111
    (0 ~ 127)

但是如果在计算机中这样表示负数,那么相加减就很不方便。试想 -1 + 1 = 0 ,换成二进制就是:

  1 000 0001
+ 0 000 0001
-------------
  1 000 0010

计算机计算出来结果就是1 000 0010,这个结果等于-2,不是等于0,如果要保证结果正确,就需要修改计算机做加法的方式,非常不方便。于是设计计算机的人员就想到一个好方法,采用补码形式来表示有符号数。简单的说-1不是用1 000 0001来表示,而是用补码1 111 1111来表示,我们再来看下采用补码形式的 -1 + 1 的结果

  1 111 1111
+ 0 000 0001
----------------
 10 000 0000

因为是8位二进制数,所以舍弃最高位1,看下结果,非常完美,就是0

其实在上面的例子中,1 000 0001就是-1的原码,而1 111 1111就是-1的补码。这下原码和补码的定义就都有了。

那么补码怎么计算出来的呢?

1、正数:原码和补码一致
2、负数:原码取反,然后加1

例如求-1的补码:-1原码是1 000 0001,符号位保持不变,取反就是 1 111 1110 ,然后加1,就得到补码1 111 1111了。

大家会发现,-1的补码还可以这么求:1取反(包括符号位),然后加1,其实也能得到-1的补码。在程序中,求一个数的相反数,如果看到这样的写法 ~num + 1,其实就是这个原理了。我个人还是更喜欢直接用 -1 * num,这样更通俗易懂。

转载请注明:快乐编程 » 计算机中的负数表示,原码、反码、补码原理

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址