设为首页 收藏本站 订阅本站

blogger

原码、反码、补码又蒙了

cache 发布于 技术文档 2013-05-19 [ 4070 ] 次浏览 [ 1 ] 条评论

原码、反码、补码又蒙了,在自己的Q空间里发现在的一篇08年写的日志,愣是没看懂,只是想的起来是自己记录的。

年前就思考的问题,很久没看有点陌生了,今天开始学习java遇到了这个问题,重新查找了些资料,看完有了更深刻的理解。无符号整数无所谓反码、补码之说,但是对于符号整数计算机采用补码可以提高cpu的处理效率。数值单元最高位是符号位,指示该数是正还是负,对于正整数原码、反码、补码都是一样的,而负整数就有区别了,反码是原码除最高位外其余所有位的逐位求反, 将反码加上1就得到补码。下面以8位数值单位来举例,例如:
用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示27个数的绝对值,再考虑正负两种情况,27*2还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码。到这里很多人就会想,那负数是不是从10000001到11111111依次表示-1到-127,那你发现没有,如果这样的话那么一共就只有255个数了,因为10000000的情况没有考虑在内。实际上,10000000在计算机中表示最小的负整数,就是这里的-128。因为-128 + 1 = -127,那么把10000000 加上1即10000001表示-127就容易计算很多了。这样,从10000001到11111111就刚好依次表示-127到-1。这就是所谓的补码。
那么补码是怎样直接地转换得来呢,这里还要引入另一个概念——反码,所谓反码就是把负数的原码去掉高位其余各个位按位取反,是1就换成0,是0就换成1,如-1的原码是10000001,那么-1的反码就是11111110,而补码就是在反码的基础上加1,即-1的补码是11111110+1=11111111,因此我们可以算出-1在计算机中是按11111111储存的。

现在居然愣是看不懂了,我想计算机中传说的狗年对于我来说已经来到了。

原码、反码、补码又蒙了:目前有 1 条留言

  1. # 沙发
    cache:

    奇了怪了,这篇文章标签加不上了.

    2013-06-03 02:34 [回复]

发表评论