什么是补码?怎么求补码?
看看书,就会知道,补码,是有严格定义的。
按照定义来求补码,就用不着涉及原码反码。
如果,你非要用求反加一的做法,就难免碰上原码反码。
但是,的八位码长的限制下,-128,既没有原码,也没有反码。
这时,你还要用求反加一的做法,就一定会碰的头破血流。
------------
按照补码的定义,负数的补码,定义如下:
[X]补 = 模-| X |
按照定义,-128,如下求补码。
[-128]补 = 256-|-128| = 128
写成二进制,就是:1000 0000。
------------
这就是详解。
简不简单? 意不意外?
是不是比“求反加一”更方便?
可以参考:网页链接
看到上一篇答案,后面有许多人留言评论。
呵呵,多数人,都是推崇“求反加一”的。
你们这些人,都是被人忽悠瘸了。
如此简单的定义、方法,你们不学、不用,
偏要去钻死胡同,呵呵
使用求反加一!!!
你们能找到-128 的原码、反码吗?
128 =1000 0000,8位机器
[-128]原码 = 1000 0000 发生了溢出,最高位表示符号位:0为正数,1为负数
[-128]反码 = 1111 1111 除符号位外,各位取反
[-128]补码 = 1000 0000 反码的末位加1,不能影响符号位
楼主你的先说,是多少位的数
是什么码 原码补码余127码,很多
实际上8位的2进制数里用负零 -0来表示-128的,你想想,取反+1,就是补码
-127=11111111 -1+127=10000000 符号位不变,进位溢出了
求补码,有【通用的定义式】。 也有简易操作的“取反加一”。
“取反加一”的方法流传太广,以至于取代了定义式的主要地位。
其实,原码、反码、符号位、取反加一,这些,是一个不完善的方法。
因为“取反加一”有缺陷,所以,“如何求-128 补码”就是一个难题。
“取反加一”其根本的弊病在于:
世界上,只有一个零,但是原码反码,都设定了两个编码,这就乱套了。
此时,八位原码反码的表示范围,只能是:-127~+127。
但是,八位补码,却要表示-128!
-128 没有原码反码,“取反加一”从何处下手?
很多人,都没有学到【补码的定义式】,所以,就不会求了。
另外,[-0]补码=0000 0000,也是难以解释的。
-0,符号位不应该是 1 吗?
难道,-0 是正数?
有人辩解说,0 只有一个补码,没有+0、-0 之分。
一个补码,是谁规定的?
原码反码,又为什么要弄两个编码?
[-0]反码 + 1,是不是补码?
“取反加一”,就是一大篇自相矛盾的谬论。
用【补码的定义式】求补码,就什么毛病都没有了。
但是,弄的太简单了,就无法体现出计算机老师的水平高了。
这个根本就不对,根本就不能用取反再加一的方式来求-128的补码。对于8位带符号数,原码和反码的表示范围都是-127~+127。也就是说对于8位的二进制数,根本就没有-128的原码、反码这一说。
-128的补码可以这么来理解:补码是一种循环计数系统,类似于钟表,比方说实际时间为7点,时针错误的停在11点上,怎么调整呢?两种方式,一是逆时针转4,即11-4=7;二是顺时针转8,即11+8=11+(-4+12)=12(自动舍掉)+7=7。模就是循环计数系统中所表示的最大数。所以(-4)与(+8)对模12互为补数,同余数。
对于8位二进制数,模为256。随便举个例子(-6)和(250)对模256互为补数,同余数。也就是说-6的补码就是250的二进制形式,即1111 1010。
那我们就可以得出(-128)和(+128)对模256互为补数了,也就是-128的补码就是128的二进制形式1000 0000。