我们都知道计算机中数据计算采用的是二进制,采用的是补码。为什么采用补码呢,直接用原码不好吗?为什么要费那么大劲转化成补码的形式再进行计算。
其中一个最重要的原因是原码和反码在表示数字0的时候存在二义性,计算机无法判定
比如0000 0000原码表示的是数字0,1000 0000原码表示的是数字-0,(反码和原码的表示0的方式是一样的)
数字0在原码和反码表示方式中存在两种情况,
补充:正数的原码,反码和补码是一样的
负数的反码=原码除符号位各位求反,
负数的补码=反码+1;
补码表示0的数值只有一种情况
0000 0000 +0的表示方式
1000 0000 求其补码=反码+1(1111 1111+1)=0000 0000最高位溢出了,符号位变成了0
所以说补码的0的表示方式只有一种不存在二义性,所以采用补码的形式计算
其中1000 0000的补码表示的是-128的补码
n位补码能表示的范围:有符号数是 -2^(n-1)到2^(n-1)-1 无符号数是 0-2^n-1
补充一下:关于原码和补码之间转化比较简单的一个方法:
大家都知道,对于计算机中的运算,都是以二进制的形式计算,那么很多时候,原码,反码,补码的计算是很烦人的(对于我来说吧),所以有一种简单的方式:
记住,以下是原码和补码互换的(负数),正数的补码反码和原码是一样的,这个你应该知道吧
(唯一的,也是独特的)规则如下:从数的右边往左开始数,遇到“0”不理它,直到遇到第一个“1”为止,以后的每一位数取反即是它的原码或补码,符号位不变,还是“1”(补码的补码是原码)
如原码:11010100 ----- 从右往左数,第一位是0,不理它,第二位还是0不理它,第三位是1,那么从此以后的每位取反,即为它的补码了.答案为:10101100
看懂了吗?
你的题目:101011 (求补码) 从右往左数,第一位是1,那么,以后每位都取反,来吧,跟我来,倒数第一位是1,倒数第二位是0(因为要取反了),倒数第三位是1,倒数第四位是0,倒数第五位是1,第六位是符号位,还是1.那么,最后的结果就是:110101
它的反码当然只是求反而已了(除符号位之外的其它各位都取反即可),答案为:110100
补码为101011,那么它的原码是什么?
按照我刚说的,补码的补码就是原码了.对这个数求补试试看.
会吗?一样的.从可往左数,倒数第一位是1,那么以后每位都取反就成它的原码了(因为这个数是一个补码),答案就是:110101