补码运算法则
A. 补码运算
补码相加后的结果:1010
1100
是答案的补码,要转化成原码,才是最终答案.
补码转原码方法同原码转补码,即符号位不变,其余按位取反后+1
1010
1100
求反:1101
0011
求补:1101
0100
即:-84
这里用到了补码的运算规则:[X+Y]补=[X]补+[Y]补
求出[X]补+[Y]补后还要求一次补,才能得到答案X+Y
(1)补码运算法则扩展阅读:
补码运算原理: 在计算机里,如果我们要计算5-3的值,我们既可以用5减去3,也可以用5加上13。
这就像我们的钟表,它从1点走到12点之后,又回到了1点。我们的计算机也是,从0走到15之后,再往下走就又回到了0,就像我们转了一个圈一样。我们从5这个位置往回退3个格,就完成了5-3这个计算。
我们也可以从5这个位置往前走,一直走到15,这时我们走了10个格,然后我们继续往前走,走到0,然后到1,然后就走到了2。这样,我们往前走了13个格之后,也到了2这个位置。
所以说,在我们这个计算机中,减3和加13是一样的。而3+13=16,我们说在模16的系统下,3和13是互补的。
这样,我们计算5-3就可以换成5+13。3的二进制表示为0011,5的二进制表示为0101。这样,0101-0011就可以表示为0101+(-0011)。
我们在计算机中都是把负数用其补码表示,-0011的补码就是10000-0011(即16-3,也就是13)。10000-0011=1+1111-0011=1+(1111-0011)=1+1100=1101。
我们总说补码是“按位取反再加一”,看了上面这个式子相信大家就会明白了,其实就是把10000-0011换成了1111-0011再加1的形式。
然后,0101-0011就换成了0101+1101,它们计算出来的结果为10010。由于我们的计算机只有四个bit,所以结果为0010。即,在模16的计算机中,5-3=5+13=2。
参考资料:补码_网络
B. 补码运算规则是什么
对于正数,原码反码补码都是一样的,对于负数,不看符号位对于剩下求反。
就是把0变成1把1变成0,就是求反了,求反后+1再添上符号位.就得到了补码,注意这里符号位是不参与取反与+1的10000001
首位(符号位)是1,这个数位负数。
取反:11111110加1
11111111结果为-127
(2)补码运算法则扩展阅读:
正数
正整数的补码是其二进制表示,与原码相同。
例:+9的补码是00001001。(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)
C. 补码的加法是怎么算的
计算机内部加法和减法一律按照补码相加(减)计算的
45的补码(等于原码):00101101
-83的补码(原码除符号位不变,其余位取反;+1):10101101
两者相加,得:11011010
最后还原成原码:(先-1,再符号位不变,按位取反,得:10100110=>-38)。
D. 二进制补码怎么计算的
1、正数的补码表示:
正数的补码 = 原码
负数的补码 = {原码符号位不变} + {数值位按位取反后+1} or
= {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边安位取反}
以十进制整数+97和-97为例:
+97原码 = 0110_0001b
+97补码 = 0110_0001b
-97原码 = 1110_0001b
-97补码 = 1001_1111b
2、纯小数的原码:
纯小数的原码如何得到呢?方法有很多,在这里提供一种较为便于笔算的方法。
以0.64为例,通过查阅可知其原码为0.1010_0011_1101_0111b。
操作方法:
将0.64 * 2^n 得到X,其中n为预保留的小数点后位数(即认为n为小数之后的小数不重要),X为乘法结果的整数部分。
此处将n取16,得
X = 41943d = 1010_0011_1101_0111b
即0.64的二进制表示在左移了16位后为1010_0011_1101_0111b,因此可以认为0.64d =0.1010_0011_1101_0111b 与查询结果一致。
再实验n取12,得
X = 2621d = 1010_0011_1101b 即0.64d =0.1010_0011_1101b,在忽略12位小数之后的位数情况下,计算结果相同。
3、纯小数的补码:
纯小数的补码遵循的规则是:在得到小数的源码后,小数点前1位表示符号,从最低(右)位起,找到第一个“1”照写,之后“见1写0,见0写1”。
以-0.64为例,其原码为1.1010_0011_1101_0111b
则补码为:1.0101_1100_0010_1001b
当然在硬件语言如verilog中二进制表示时不可能带有小数点(事实上不知道哪里可以带小数点)。
4、一般带小数的补码
一般来说这种情况下先转为整数运算比较方便
-97.64为例,经查询其原码为1110_0001.1010_0011_1101_0111b
笔算过程:
-97.64 * 2^16 = -6398935 =1110_0001_1010_0011_1101_0111b,其中小数点在右数第16位,与查询结果一致。
则其补码为1001_1110_0101_1100_0010_1001b,在此采用负数的补码 = {原码符号位不变} + {数值位按位取反后+1} 方法
5、补码得到原码:
方法:符号位不动,幅度值取反+1or符号位不动,幅度值-1取反
-97.64补码 =1001_1110(.)0101_1100_0010_1001b
取反 =1110_0001(.)1010_0011_1101_0110b
+1 =1110_0001(.)1010_0011_1101_0111b 与查询结果一致
6、补码的拓展:
在运算时必要时要对二进制补码进行数位拓展,此时应将符号位向前拓展。
-5补码 = 4'b1011 = 6'b11_1011
ps.原码的拓展是将符号位提到最前面,然后在拓展位上部0.
-5原码 = 4‘b’1101 = 6'b10_0101,对其求补码得6'b11_1011,与上文一致。
(4)补码运算法则扩展阅读:
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
E. 什么是补码,怎么计算
无论什么类型的数字,在计算机中,都是以“二进制代码”存储的。
下面按照八位二进制来说明,其它位数,自行脑补。
十进制数 0,存放的,就是二进制 0000 0000。
十进制数 +1,就加上 1,二进制是 0000 0001。
十进制数 +2,就再加 1,二进制是 0000 0010。
。。。
十进制数 +127,加 1加 1...,就加到了 0111 1111。
+127,这就是最大数值。
----------
负数怎么办?你就从 0,依次递减吧。
十进制数 0,以二进制 0000 0000 存放。
十进制数 -1,就减去 1,得 1111 1111 = 255(十进制)。
十进制数 -2,就再减 1,得 1111 1110 = 254。
十进制数 -3,就再减 1,得 1111 1101 = 253。
。。。
十进制数 -128,减 1减 1...,得 1000 0000 = 128。
不要再减了,这就是最小值了。
(你再继续减,就是 0111 1111,这就是+127 了。)
因此,最小数就是-128。
----------
总结:
零和正数:直接用二进制存放。
负数:存放形式是【256+这个负数】。
这套存放格式,就是所谓的【补码】。
求【补码】,就是这么简单。
完全不用绕到“原码反码符号位”那么远。
可以用十进制来计算。如果需要二进制,你就再转换一下。
用这个方法,不涉及原码反码符号位,就少了不少麻烦事。
----------
为什么负数用补码存储?
利用补码,可以把减法运算,转换成加法。
(所以,在计算机中,有一个加法器,就够用了。)
例如,6-2 = 4,用补码运算如下:
6 的补码是 0000 0110
+-2 的补码是 1111 1110
-----------------
(1)0000 0100 (= 4 的补码)
(括号中的 1,是进位,舍弃不要了。)
注意:
如果运算结果超出了-128~+127 的范围,结果将是错的。
这种现象称为“溢出”。
再注意一下:进位,并不等于溢出。
---------
因为补码的这个特性,所以,在计算机中,只是使用补码存放数据。
而原码反码,在计算机中,都是不存在的。
原码反码 的用途,仅仅是用于“心算、笔算”。
其实,笔算的方法,并非只有“取反加一”。
另外,-128,有补码,但是却没有原码反码!
用“取反加一”来求-128 的补码,无异于缘木求鱼。
所以,大家,完全不必在原码反码 上浪费时间精力。
但是,考试怎么办?
呃 ...,还是别跟老师较劲,他怎么乱讲,你就怎么答吧。
F. 总结原码,反码和补码的表示方法和运算规则.为什么在计算机中大多采用补码
在计算机系统中,正负数值,一律采用补码来表示和储存。
原码和反码,在计算机中,都是不存在的。
补码,就是一个【代替负数运算的正数】。
利用补码,减法就可以用加法运算代替了。
计算机中,只要配置一个加法器,就可以加、减通用了。
原码和反码,都没有这种功能,所以,计算机中不使用它们。
----------------------
正数,怎么就能代替负数呢?
且看 2 位 10 进制:
25 - 1 = 24
25 + 99 = (一百) 24
只要舍弃进位,+99 就能当做-1 使用。
+99 就称为-1 的补数。
计算公式: 补数 = 负数 + 10^n,n 是位数。
----------------------
计算机用二进制,补数,就改称为:补码。
8 位 2 进制的范围:0000 0000~1111 1111(十进制 255)。
求补码的计算公式:
负数的补码 = 负数 + 2^8 = 负数 + 256。
正数,不需任何变换,直接就可以进行计算。
所以,正数,并不存在补码。
-1 的补码是:-1 + 256 = 255 = 1111 1111。
-2 的补码是:-2 + 256 = 254 = 1111 1110。
。。。
-128 的补码是: 128 = 1000 0000。
----------------------
运算实例: 7 - 2 = 5,用补码计算如下:
7 =0000 0111
-2 的补码 =1111 1110
---相加-----------
得:(1)0000 0101= 5
舍弃进位,结果,就完全正确。
----------------------
补码,就是补码,与原码反码毫无关系。
从“取反加一”来学习补码,不但不能理解补码的意义,而且还难以求出-128 的补码。
为了解释-128 的补码,还得编造许多瞎话。
G. 二进制补码怎么算
1、在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 2、补码与原码的转换过程几乎是相同的。 数值的补码表示也分两种情况: (1)正数的补码:与原码相同。 例如,+9的补码是00001001。 (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码 0000111按位取反为1111000;再加1,所以-7的补码是11111001。 已知一个数的补码,求原码的操作分两种情况: (1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。 (2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取 反,然后再整个数加1。 例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负 数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。 在“闲扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。我在这里稍微介绍一下“模” 的概念: “模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范 围,即都存在一个“模”。例如: 时钟的计量范围是0~11,模=12。 表示n位的计算机计量范围是0~2(n)-1,模=2(n)。【注:n表示指数】 “模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的 余数。任何有模的计量器,均可化减法为加法运算。 例如: 假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法: 一种是倒拨4小时,即:10-4=6 另一种是顺拨8小时:10+8=12+6=6 在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。 对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特 性。共同的特点是两者相加等于模。 对于计算机,其概念和方法完全一样。n位计算机,设n=8, 所能表示的最大数是11111111,若再 加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的 模为2(8)。 在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以 了。把补数用到计算机对数的处理上,就是补码。 另外两个概念 一的补码(one's complement) 指的是正数=原码,负数=反码 而二的补码(two's complement) 指的就是通常所指的补码