什么是补码,怎么计算

2024-11-07 22:43:01
推荐回答(3个)
回答1:

无论什么类型的数字,在计算机中,都是以“二进制代码”存储的。

下面按照八位二进制来说明,其它位数,自行脑补。

十进制数 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 的补码,无异于缘木求鱼。

所以,大家,完全不必在原码反码 上浪费时间精力。

但是,考试怎么办?

呃 ...,还是别跟老师较劲,他怎么乱讲,你就怎么答吧。

回答2:

补码不是特意设计出来的。

正常数字的计算,就有“补数”出现。

比如一个小朋友,数数,只会数到两位,到了一百,就从头开始数。

循环的周期,就是一百。

那么,对于他来说,减一,就和 +99 相同。

如:  24 - 1 = 23

    24 + 99 = (一百) 23

忽略进位的一百,这两种算法,就是相同的。

99,就是-1 的补数。

计算公式: 补数 = 周期 + 负数。

按此公式,大家可以自己求出其它负数的补数。

-----------------

在计算机中,使用二进制,补数,就称为:补码。

各种计算机,所能计算二进制的位数,都是固定的。

八位机中,其数字是:0000 0000 ~ 1111 1111(十进制255)。

再加一,出现的进位就是 2^8 = 256。

即,八位机的计数周期,是 256。

按照前面的公式,负数的补码是: 周期 + 该负数。

(也有写成: 周期 - | 负数 |。 即:周期 - 对应的正数。)

那么,-1 的补码,就是 256-1 = 255 = 1111 1111(二进制)。

用“取反加一”来求,也是这个结果。

但是,用“取反加一”,就要记很多无用的东西:原码反码符号位等等。

而且,学习“取反加一”这方法,学不明白“加法代替减法”。

也不知道为什么,各本书,都写这些模糊学生思维的方法。

回答3:

补码的设计目的是:
⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.
⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计 所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。
负数的补码就是对反码加1,而正数不变,正数的原码反码补码是一样的。