原码,反码,补码,移码

简单介绍

1、正数的原码、补码、反码均为其本身;
2、负数(二进制)的原码、补码、反码公式:
反码 = 原码(除符号位外)每位取反
补码 = 反码 + 1
反码 = 补码 - 1

移码 = 补码符号位取反

1011
原码:01011
反码:01011 //正数时,反码=原码
补码:01011 //正数时,补码=原码
移码:11011 //原数+10000

-1011
原码:11011
反码:10100 //负数时,反码为原码取反
补码:10101 //负数时,补码为原码取反+1
移码:00101 //原数+10000

0.1101
原码:0.1101
反码:0.1101 //正数时,反码=原码
补码:0.1101 //正数时,补码=原码
移码:1.1101 //原数+1

-0.1101
原码:1.1101
反码:1.0010 //负数时,反码为原码取反
补码:1.0011 //负数时,补码为原码取反+1
移码:0.0010 //原数+1
0 的原码
+0: 0000 0000 -0 :1000 0000
0的反码
+0: 0000 0000 -0 :1111 1111
0的补码
+0: 0000 0000 -0: 0000 0000
0的移码(补码符号位取反)
+0&-0:1000 0000

原码的标识范围 -127——+127
0000 0000 表示+0
1000 0000 表示-0
0111 1111 表示+127
1111 1111 表示-127

反码的标识范围 -127——+127
0000 0000 表示+0的反码
1111 1111 表示-0的反码
0111 1111 表示+127的反码
1000 0000 表示-127的反码

补码的标识范围 -128——+127
0000 0000 表示+0的补码
0000 0000 表示-0的补码
0111 1111 表示+127的补码
1000 0001 表示-127的补码

求原码、反码和补码的数据表示范围?简当解释一下,谢谢_百度作业帮
原码,反码,补码:[2]补码的范围_百度经验

为什么补码的标识范围是-128到+127,比原码和反码要多一个?

  1. 从上面可以看出,+0和-0的补码是一样的,所以可以多表示一个数。多出来的一个二进制标识码是 1000 0000。
  2. 因为1000 0000 (补码)=1000 0001(-127的补码) +1111 1111(-1的补码)=-127+(-1)=-128。
  3. (-128)没有相对应的原码和反码

使用反码、补码、移码的原因

1、在计算机中,实际上只有加法运算,减法运算也要转换为加法运算,
  乘法转换为加法运算,除法转换为减法运算。
2、在计算机中,对任意一个带有符号的二进制,都是按其补码的形式进行运算和存储的。
之所以是以补码方式进行处理,而不按原码和反码方式进行处理,是因为在对带有符号位的
  原码和反码进行运算时,计算机处理起来有问题。
   所以补码的设计目的是:

  • 使符号位能与有效值部分一起参加运算,从而简化运算规则.
  • 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计

对于带符号数,机器数的最高位是表示正、负号的符号位,其余位则表示数值。
先不谈其他的问题,只谈二进制表达数据的问题(我也不知道怎么说),看下面的例子:
假设机器字长为8的话:

  • 一个十进制的带符号整形 1,表达为二进制就是 (0000 0001)
  • 一个十进制的带符号整形 -1,表达为二进制就是 (1000 0001)

那么,两者相加 ,用十进制运算 1+(-1)=0

在看二进制运算 (0000 0001)+(1000 0001)=(1000 0010) 这个数转换为十进制结果等于-2。
可以发现出问题了,如上所表示的方式,就是今天所要讲的原码。

①、原码

数值X的原码记为[x]原,如果机器字长为n(即采用n个二进制位表示数据)。则最高位是符号位。0表示正号,1表示负号,其余的n-1位表示数值的绝对值。数值零的原码表示有两种形式:[+0]原=0000 0000 ,-[0]原=1000 0000.
例子:若机器字长n等于8,则
[+1]原=0000 00001 [-1]原=1000 00001
[+127]原=0111 1111 [-127]原=1111 1111
[+45]原=0010 1101 [-45]原=1010 1101

可见,原码,在计算数值上出问题了,当然,你也可以实验下,原码在计算正数和正数的时候,它是一点问题都没有的,但是出现负数的时候就出现问题了。所以才会有我下面将的问题:反码

②、反码

数值X的反码记作[x]反,如果机器字长为n,则最高位是符号位,0表示正号,1表示负号,正数的反码与原码相同,负数的反码则是其绝对值按位求反。数值0的反码表示有两种形式:[+0]反=0000 0000 ,-[0]反=1111 1111.
例子:若机器字长n等于8,则
[+1] 反=0000 00001 [-1] 反=1111 1110
[+127]反=0111 1111 [-127] 反=1000 0000
[+45] 反=0010 1101 [-45] 反=1101 0010

在看反码计算的问题:
1+(-1)=0 | (0000 0001)反+(1111 1110)反=(1111 1111)反=(1000 0000)原=【-0】 可以看到,虽然是-0,但是问题还不是很大
1+(-2)=-1 | (0000 0001)反+(1111 1101)反=(1111 1110)反=(1000 0001)原=【-1】 可以看到,没有问题
-1+(2)=1 | 1111 1110)反+(0000 0010)反=(0000 0000)反=(0000 0000)原=【0】

可以看到,问题发生了,因为溢出,导致结果变为0了。 所以,看以看到,用反码表示,问题依然没有解决,所以,出现了下面的补码

③、补码

数值X的补码记作[x]补,如果机器字长为n,则最高位是符号位,0表示正号,1表示负号,正数的补码与原码反码都相同,负数的补码则等于其反码的末尾加1。数值0的补码表示有唯一的编码:[+0]补=0000 0000 ,-[0]补=0000 0000.
例子:若机器字长n等于8,则
[+1]补=0000 00001 [-1]补=1111 1111
[+127]补=0111 1111 [-127]补=1000 0001
[+45]补=0010 1101 [-45]补=1101 0011

在看补码计算的问题:
1+(-1)=0 | (0000 0001)补+(1111 1111)补=(0000 0000)补=(0000 0000)原=【0】 可以看到。没有问题
1+(-2)=-1 | (0000 0001)补+(1111 1110)补=(1111 1111)补=(1000 0001)原=【-1】 可以看到,没有问题
-1+(2)=1 | (1111 1111)补+(0000 0010)补=(0000 0001)补 =(0000 0001)原=【1】 可以看到,没有问题

通过上面的计算,我们发现,用补码的方式,就不存在在原码和反码中存在的计算问题了。其实,这也是计算机表达带符号整数用补码的原因。

由补码求原码

  已知一个数的补码,求原码的操作分两种情况:

  1. 如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
  2. 如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是下面两种方法:
    • 符号位为1;其余各位取反,然后再整个数加1。
    • 符号位为1;其余整个数减1,然后再各位取反。

补码的原理

要谈补码,先看看补数的问题。什么是补数,举个简单的例子,100=25+75。
100用数学来说就是模M,那么就可以这样概括。在M=100的情况下,25是75的补数。
这就是补数。25是75的补数,这是在常规世界中,在计算机上就不是这样了,因为,在计算机中,数据存在这溢出的问题。

假设机器字长是8的话,那么能表达的最大无符号数就是1111 11111,在加1的话,就变成1 0000 0000,此时因为溢出,所以1去掉,就变成0了,这个很简单,相信学计算机的人都会明白。
也就是说,在计算机中,补数的概念稍微不同于数学之中,25+75=100,考略计算机中的溢出问题,那么25+75就等于0了。也就是说,25和75不是互为补数了。

我觉得用闹钟来比喻这个问题在形象不过了,因为闹钟也存在着溢出的问题,当时间到达11:59 ,在加1分钟的话就变成0:0了,这和计算机的溢出是同一个道理。
那么,有一个时钟,现在是0点,我想调到5点,有两种方法,一个是正着拨5,到5点。第二种方法是倒着拨7,也可以到5点。正着拨5记作+5,倒着拨7,记作-7,而闹钟的M是12,也就是说,在考略溢出的情况下,M=12,对于从0到5来说,5和-7是等价的。用个数学等式可以这样表达0+5=0+-7,即0+5=0(也就是12)-7
这就是计算机中的数值计算和数学中的计算不同的地方。

接着用例子说明:
在计算机中计算十进制 1+(-2)。
1的原码是:0000 0001
-2的原码是:1000 0010
-2的补码是:1111 1110 这个二进制换做无符号的整数大小就是254,而8位二进制数的M=2^8=256。(很多文章中把M写成2^7,这根本就是不对的,根本没有解决符号位的问题)
你发现什么了没,在考略溢出的情况下,M=256时,-2和254就是等价的关系。
也就是1+(-2) 等价于了 1+254了。
这样做,好处在什么地方,你自己都可以看得到:

  • ①、利用补数和溢出的原理,减法变成了加法
  • ②、符号位不在是约束计算的问题,不会存在原码中的问题了,因为变成补码后,虽然最高位依然是1,但是这个1就不在是最为符号位了,而是作为一个普通的二进制位,参与运算了。

所以,这就是补码的原理所在,通过补数和溢出,解决了减法和负数问题。

原码,反码,补码,移码计算规则 - cc_lq的专栏 - 博客频道 - CSDN.NET
(转)理解原码,反码和补码 - 技术提高能力,沟通开拓视野 - IT博客
原码、反码、补码及移码的作用与区别 - bbirdsky - 博客频道 - CSDN.NET
4、数据在计算机中的存储形式和运算 - Kilnn - 博客频道 - CSDN.NET

机器零_百度百科
http://baike.baidu.com/link?url=hek5VQpeN9Nxc3JOqiDbY1IW-H8etiXMFK5fc1D3rmZNtV3mNkvVb08rJMv3pn8bOE5Lx9JCph2nOXkVwvpU-vz74OfxmB-vJr1zMBetdGu_qZTaaTO-1ZqubAZHUrOy

  • 15
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值