二进制补码加减运算(二进制相减的算法)
- 数据库
- 2023-08-28
- 67
大家好,今天给各位分享二进制补码加减运算的一些知识,其中也会对二进制相减的算法进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始...
大家好,今天给各位分享二进制补码加减运算的一些知识,其中也会对二进制相减的算法进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
十进制数与二进制补码的相互转换
学了好长时间,今天终于真正理解了计算机中负数的存储,终于理解了补码的运算!
1、补码的运算:
已知十进制求二进制
求正整数的二进制补码
除2取余,直到商为零,余数倒叙排列
求负整数的二进制
先求该负数绝对值的二进制代码,然后将二进制代码的所有位取反,再加1,然后在左边补1作为符号位。如果要求用更多的位来表示,则相应的在符号位的左边补1就行了。下面随便列举了一些数字,其他的相应模仿就行了:
负数:-5绝对值:5绝对值的二进制码:101二进制反码:010二进制补码:011左边再不一位1表示负数,即1011=(-1)*8+0*4+1*2+1*1=-5
补码8位表示:11111011=(-1)*(2^7)+1*(2^6)+1*(2^5)+1*(2^4)……=-5
补码16位16进制表示:FFFB=-5
以下的几个数的例子的计算过程同上:负数:-14绝对值:14绝对值的二进制码:1110二进制反码:0001二进制补码:10010=-14
补码8位16进制表示:F2=-14
补码16位16进制表示:FFF2=-14
负数:-27绝对值:27绝对值的二进制码:11011二进制反码:00100二进制补码:100101=-27
补码8位16进制表示:E5=-27
补码16位16进制表示:FFE5=-27
负数:-79绝对值:79绝对值的二进制码:1001111二进制反码:0110000二进制补码:10110001
补码8位16进制表示:B1
补码16位16进制表示:FFB1
负数:-127绝对值:127绝对值的二进制码:1111111二进制反码:0000000二进制补码:10000001
补码8位16进制表示:81
补码16位16进制表示:FF81
负数:-128绝对值:128绝对值的二进制码:10000000二进制反码:01111111二进制补码:10000000
补码8位16进制表示:80
补码16位16进制表示:FF80
行啦,就举这么多,再多就啰嗦了。下面再说一下计算机中n位二进制补码的十进制表示范围。
2、n位二进制补码的十进制表示范围
8位二进制补码最大能表示的正整数应该是127,即二进制为01111111,其中最左边0为符号位,表示正数。8位二进制补码最小能表示的负整数应该是-128,即二进制为10000000,其中最左边1为符号位,表示负数,即(-1)*(2^7)。
其他的以此类推。
计算机二进制减法的运算过程
二进制的加法按二进制的加法规则进行(对齐各位进行,相当于我们做竖式的加法):
0+0=0
0+1=1
1+0=1
1+1=10
二进制的减法运算可按照加法运算的逆运算进行:
10-1=1(借位)
1-1=0
1-0=1
0-0=0
实际上在计算机内部做减法时是用加法做的(-123就是+(-123))。这个具体细节就不容易说清楚了。需要学习二进制补码的知识和计算机组成原理才行。
二进制数补码的范围公式
8位补码范围是-128至127.
根据补码的几条规定即可推出上述结论:
1若二进制每位全为0,则表示数0
2若最高位(即符号位)为0,表示正数
3若最高位为1,表示是负数,而该负数的绝对值是多少呢?将每个二进制位(包括符号位)取反加1,得到一个二进制数,将该数看成无符号数,其值就是上述负数的绝对值。
例如,二进制的10000000的最高位为1,所以它表示的是负数。是负的多少呢?我们将其八位全部取反,得到01111111,然后加1,得到10000000.将该数看作无符号数,值为128,故计算机中的10000000表示的是-128。【关于这一点要死记硬背了,可以参考下面列出的对比数记忆】
最高位(即符号位)为1的8位有符号数有128个,故可表示128个负数;最高位为0的8位有符号数有128个,但全0的那个表示数0,所以总共只能表示127个正整数。
二进制补码怎么计算的
-85负就是1,然后计算正85:+85的原码(1010101)→按位取反(0101010)→加1(0101011)
10101011(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
【例2】求-7的补码。
因为给定数是负数,则符号位为“1”。
后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001)
所以-7的补码是11111001。
二进制变形补码计算
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,在此采用负数的补码={原码符号位不变}+{数值位按位取反后+
8位二进制补码计算公式
、补码是把减法用加法计算,采用进位丢的方法得到结果时应该补足的数。2、8位二进制补码的计算步骤是:
a)先按位取反,也就是把1变成0,把0变成1,得到反码。
b)把得到反码末位再加1即得到补码。
c)例如:10110011,先按位取反得到01001100,再把01001100加上1,得到01001101,这就是补码。
关于二进制补码加减运算到此分享完毕,希望能帮助到您。
本文链接:http://xinin56.com/su/11352.html