首页 > 编程知识 正文

补码表示无符号数,无符号数与补码相加

时间:2023-05-03 05:28:10 阅读:190825 作者:3799

有符号数和无符号数详解(2)补码详解 1. 为什么需要补码1.1 背景 2 补码的思想2.1 我们希望只设计加法运算器,不用减法运算器。2.2 现在问题是:怎么表示-1呢? 3. 补码3.1 补码的优点3.2 例子: 4. 补码的本质:参考
有符号数和无符号数详解
https://blog.csdn.net/lqy971966/article/details/106033332

1. 为什么需要补码 大多数计算机对整数使用二进制补码编码表示!!! 1.1 背景

(只设计加法运算器)

在计算机内,整数的长度是确定的,在字长为32位的计算机中,整数的长度就是32个二进制,这其中还包括了符号位(0表示正,1表示负)。
这里面我们为了方便描述,就假设机器字长为8位。

例如,十进制整数 19,二进制真值表示为 10011,其原码表示为 0001 0011。
十进制整数-19,二进制真值表示为-10111,原码表示为 1001 0011。

简而言之,源码就是最高位为符号位,其他位表示该数的绝对值
如果计算机内部采用原码表示数,那么在进行加法和减法运算的时候,最终都转化为两个绝对值的加运算和减运算,
因此,在设计计算器的时候就既需要设计加法运算器,又要设计减法运算器(代价有点大,是否可以就用一种类型的运算器呢?
其实大多数人都喜欢做加法运算,不太喜欢用减法运算)。

2 补码的思想

(从-1的由来说起)

2.1 我们希望只设计加法运算器,不用减法运算器。

我们希望找到一种方案,采用这种方案做加运算 1 + ( -1 )

用 0000 0000表示0是很自然的想法,用 0000 0001到 0111 1111表示1到127的正数,也是自然的想法

2.2 现在问题是:怎么表示-1呢?

我们做一次逆向思维,0000 0001加上什么样的二进制数可以得到0000 0000?
即:从右向左思考,加数的最右边的最低位必须是1
即:0000 0001 + (1111 1111)= 1 0000 0000
无论结果最后是多少,都只保留8位,多余的位会被丢弃。因此,我们可以将 1111 1111来表示-1
下面就是采用一种方式来合理的将-1怎么变成 1111 1111这种形式。

3. 补码

(解决了只设计加法运算器,不设计减法运算器)

带符号整数有原码、反码、补码等几种编码方式。
正整数的原码、反码和补码都一样
负数的反码是对原码的除符号位外的其他位进行取反后的结果
而补码是先求原码的反码,然后在反码的末尾位加1后得到结果,即补码是反码+1

3.1 补码的优点

它的便利体现在,所有的加法运算可以使用同一种电路完成。

3.2 例子:

以-8作为例子。
假定有两种表示方法。一种是直觉表示法,即10001000;另一种是-8补码表示法,即 1111 1000
随便写一个计算式,16 + (-8) = ?
16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:
 00010000
+10001000
---------
 10011000
可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。
也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法。
因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。
从电路上说,就是必须为加法运算做两种电路。

现在,再来看 8 的补码表示法。
 00010000
+11111000
---------
100001000
可以看到,按照正常的加法规则,得到的结果是100001000。
注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。
所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。
展到整个整数集,从而用一套电路就可以实现全部整数的加法。

4. 补码的本质:

要将正数转成对应的负数,其实只要用0减去这个数就可以了。
比如,-8其实就是0-8。
已知8的二进制是00001000,-8就可以用下面的式子求出:
 00000000
-00001000
---------
11111000
0不够借,最高位借1
补码的两个转换步骤就是这么来的。

参考

https://blog.csdn.net/m0_37955444/article/details/79848485

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。