大家好,欢迎来到IT知识分享网。
首先通过一个表格简单介绍下什么是原码、反码、补码:
(以八位二进制数为例):
正数的原码、反码、补码等于它二进制的本身(以12为例)
权值 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
原码 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
反码 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
补码 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
而一个负数的原码就是在最高位(也就是符号位)写1,反码就是符号位为1,其余数字对原码取反,补码就是对反码的最后一位+1
权值 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
原码 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
反码 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 |
补码 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
在计算机中,数字都是以二进制补码的方式存储。
采用补码表示法的特征(优势):
(1)补码表示法可以将符号位和其他位统一处理,同时减法也可以当作加法处理,简化运算规则,从而简化运算器的结构,即采用补码表示法的数字,不管是加法还是减法都可以用加法运算来实现;
(2)补码表示法相加时,如果最高位有进位,则进位被舍弃;
(一个字节有八位,为了简便现在以3位二进制举例:以十进制的数3为例)
3的二进制数为:011;而-3的二进制数为101;
做一下验算:
011
+ 101
—————
1000
此时我们是以三位二进制数举例,加上最高位的1,已经达到了4位数,此时产生“溢出”进位,舍掉1后发现二进制的000在十进制中也的确表示0,即3+(-3)=0,因此-3的二进制的确为101;
接下来介绍求负数补码的三种办法
一、写出负数的原码,利用原码求补码
求负数的原码时(以-12为例),将最高位(符号位)变成1,其余位数不变(即10001100);
求负数的反码时,符号位不变(相对于负数的原码而言)其余位数取反,即11110011;
求负数的补码时,符号位不变,其余位数取反,并在最后一位加一(也可以说在求得反码后,在反码的末尾+1),即11110100;
二、先表示出其绝对值的原码(同样以-12为例)
|-12|=12;
12的二进制原码:00001100
我们可以从右向左扫描,遇到0直接抄下来,遇到第一个1也直接抄下来,从第一个1往后,所有的数字都取反,也就是11110100;
三(需要引入模的概念)、设需要求的负数为n,模为mod,dec=mod-|n|,则n的补码与dec相同;
什么是模?
从本质上说就是计算器在计算时产生溢出时的量,它的值在计算器中表示不出来,计算器只能表示出模的余数;
1.对于时钟来说,时钟的计量范围为0~11(共包含12个数),模=12;
比如当前时间是0点,而表盘时针指向5点,想回正表盘有两个方法,1.逆时针旋转5h;2.顺时针旋转7h;也就是5-5=0或5+7=12(时钟模为12,表盘上12与0为同一位置),因此可以用时钟的前进来代替后退。
2.用一个字节(8位)的二进制表示一个数字时,其表示范围为0~2^8-1,其模为2^8;
接下来同样以四位二进制数情况下的-12为例求补码
此时n=-12;|n|=12;
dec=mod-12;由于是用四位二进制表示,因此表示范围为2^4=16.即mod=16;
dec=16-12=4;即在四位二进制数情况下,-12的补码与4的补码相同
8 | 4 | 2 | 1 | |
原码 | 1 | 1 | 0 | 0 |
补码 | 0 | 1 | 0 | 0 |
即0100
当用5位二进制数表示-12补码时,2^5=32,dec=32-12=20,即-12补码=20的补码
16 | 8 | 4 | 2 | 1 | |
原码 | 1 | 0 | 1 | 0 | 0 |
补码 | 1 | 0 | 1 | 0 | 0 |
即:10100
同样原理,在用6位、7位、8位的二进制数表示时(具体用几位表示,可以看你心情或者题目要求),方法一样,发现区别只是在高位多加一个1,当求8位时,高位补满1,发现最终结果为11110100,这个结果与前两种方法所得结果一样,因此是正确的~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24721.html