关于原码、反码和补码,想一想为什么

   相信大家看到这个标题都不屑一顾,因为在任何一本计算机基础知识书的第一章都有他们的解释,但是在书上我们只能找到一些简单的定义,没次看过之后不久就忘 了。最近论坛里有人问起这些概念,看到很多人的回复是以前看过现在忘了去看看某某书之类,很少有给出一个合理的解释。于是本人就开始思考(虽然上帝会发 笑,我还是要思考。),于是得出了以下的结论。

 

     数值在计算机中表示形式为机器数 , 计算机只能识别 0 1, 使用的是二进制 , 而在日常生活中人们使用的是十进制 ," 正如亚里士多德早就指出的那样 , 今天十进制的广泛采用 , 只不过我们绝大多数人生来具有 10 个手指头这个解剖学事实的结果 . 尽管在历史上手指计数 (5,10 进制 ) 的实践要比二或三进制计数出现的晚 ."( 摘自 << 数学发展史 >> 有空大家可以看看哦 ~, 很有意思的 ). 为了能方便的与二进制转换 , 就使用了十六进制 (2 4 ) 和八进制 (23 ). 下面进入正题 .

数值有正负之分 , 计算机就用一个数的最高位存放符号 (0 为正 ,1 为负 ). 这就是机器数的原码了 . 假设机器能处理的位数为 8. 即字长为 1byte, 原码能表示数值的范围为

(-127~-0 +0~127) 256 .

     有了数值的表示方法就可以对数进行算术运算 . 但是很快就发现用带符号位的原码进行乘除运算时结果正确 , 而在加减运算的时候就出现了问题 , 如下 : 假设字长为 8bits

( 1 ) 10 -  ( 1 )10   =  ( 1 )10   + ( -1 )10   =   ( 0 )10

(00000001)   + (10000001)   = (10000010)   = ( -2 )  显然不正确 .

     因为在两个整数的加法运算中是没有问题的 , 于是就发现问题出现在带符号位的负数身上 , 对除符号位外的其余各位逐位取反就产生了反码 . 反码的取值空间和原码相同且一一对应 . 下面是反码的减法运算 :

  ( 1 )10   -  ( 1 ) 10 =  ( 1 ) 10 + ( -1 ) 10 =   ( 0 )10

  (00000001)  + (11111110)   =  (11111111)   =  ( -0 )   有问题 .

( 1 )10   -  ( 2)10   =  ( 1 )10   + ( -2 )10   =   ( -1 )10

(00000001)  + (11111101)   =  (11111110)   =  ( -1 )  正确

问题出现在 (+0) (-0) , 在人们的计算概念中零是没有正负之分的 .( 印度人首先将零作为标记并放入运算之中 , 包含有零号的印度数学和十进制计数对人类文明的贡献极大 ).

于是就引入了补码概念 . 负数的补码就是对反码加一 , 而正数不变 , 正数的原码反码补码是一样的 . 在补码中用 (-128) 代替了 (-0), 所以补码的表示范围为 :

(-128~0~127) 256 .

注意 :(-128) 没有相对应的原码和反码 , (-128) = (10000000)   补码的加减运算如下 :

( 1 ) 10 -  ( 1 ) 10 =  ( 1 )10   + ( -1 )10   =   ( 0 )10

(00000001)   + (11111111)   =  (00000000)   = ( 0 )  正确

( 1 ) 10 -  ( 2) 10 =  ( 1 )10   + ( -2 )10   =   ( -1 )10

(00000001)  + (11111110)  =  (11111111)   = ( -1 )   正确

     所以补码的设计目的是 :

⑴使符号位能与有效值部分一起参加运算 , 从而简化运算规则 .

⑵使减法运算转换为加法运算 , 进一步简化计算机中运算器的线路设计

     所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、 C 等其他高级语言中使用的都是原码。看了上面这些大家应该对原码、反码、补码有了新的认识了吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值