计算机为什么要用补码

转自:https://blog.youkuaiyun.com/bendanban/article/details/8681456

计算机使用补码表示负整数!正整数就用源码来表示。那什么是补码呢?其实源码的补码就是源码的相反数,他们相加得0 。

计算负整数的补码:
规则就是源码各位取反,然后加1得到。

例如:如果我们用8位来表示有符号整数的话,那么十进制1用二进制表示为:

00000001
这个数取反加1的结果是:
11111111

所以,-1的补码就是11111111。
大家可能会有疑问,到底什么是补码,为什么-1的补码不是-1的源码取反加1呢?

这是因为:-1的补码是1的补码表示法。所以计算机里用1的相反数(就是-1的补码)来表示-1 。

计算二进制有符号数的十进制数
既然有符号数在计算机里有补码表示负整数,那我们如何根据给定的二进制数来计算十进制数呢?

看例子:

假设给了一个数:

10000100

看符号位为1,为负数,所以这个数是用补码表示的!先计算源码。

各位取反加1的结果是:

01111100(二进制) = 124(十进制)

所以原先给出的二进制数的十进制数是 -124 。


计算负整数的二进制补码表示
继续刚才那个例子,如果我们拿到的是十进制-124,那么他的二进制补码是多少呢?

其实他的补码就是124的二进制数求补的结果。

124的二进制数为:01111100

取反                       :10000011

加1                         :10000100

所以-124的二进制补码表示就是10000100

为什么使用补码表示负整数
原因很简单,如果使用补码表示负整数,那么ALU在做整数之间的操作时,就不用区分符号了,所有位都会参与运算,其上上面的例子中,符号位都参与了运算。

例如执行2-1这个操作,我们可以用2+(-1)来计算。

2的二进制数是:00000010

1的二进制数是:00000001   -->   -1的二进制补码是:11111111

所以2+(-1):

  00000010
+ 11111111
----------------
  00000001

结果是1。
我们再看个结果为负数的。

求1-2的结果,用1+(-2)来计算。

2的二进制数是:00000010,所以-2的二进制数为:11111101+1=11111110

1+(-2)的计算过程是:

  00000001
+ 11111110
---------------
  11111111

这个结果的十进制数是多少呢?
首先它是个负数,说明结果使用补码表示的,将各位取反加1后的结果是00000001=1(十进制),然后加上他的符号,就是-1了,

所以1+(-2)的结果是-1 。

用补码计算确实简化了ALU的设计难度!!所以计算机用补码来表示负整数!!!!

应该看明白了。。
--------------------- 
作者:bendanban 
来源:优快云 
原文:https://blog.youkuaiyun.com/bendanban/article/details/8681456 
版权声明:本文为博主原创文章,转载请附上博文链接!

计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码可以将符号位和数值域统一处理,同时加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路[^1]。 ### 补码的优势 1. **统一处理符号位和数值域**:补码将符号位和数值部分统一处理,简化了计算机的设计和实现。在补码表示中,正数和负数的符号位被自然地融入了数值的表示中,使得运算逻辑更加简单[^1]。 2. **统一加法和减法**:通过补码,加法和减法运算可以统一为加法操作。例如,计算 $ 3 + (-2) $ 可以直接通过补码相加实现,结果仍然正确。这种特性使得计算机只需要实现加法器,而不需要单独的减法器,从而降低了硬件复杂度[^3]。 3. **避免零的多重表示**:在原码和反码表示中,存在 $ +0 $ 和 $ -0 $ 两种不同的表示形式,这可能会导致计算错误。而补码解决了这个问题,确保零只有一种表示形式,进一步提高了计算的准确性[^4]。 4. **扩展数值范围**:补码表示能够多表示一个最低数。例如,在8位二进制中,原码或反码表示的范围为 $[-127, +127]$,而补码表示的范围为 $[-128, 127]$。这种扩展能力使得补码能够更有效地利用有限的二进制位数[^4]。 5. **溢出处理**:在补码运算中,溢出并不会影响结果的正确性。例如,在8位计算机上计算 $ 16 + (-8) $,通过补码加法可以得到正确的结果 $ 8 $。溢出的高位会被自动舍去,而不会影响最终结果[^5]。 ### 示例:补码加法 以下是一个简单的补码加法示例,计算 $ 3 + (-2) $: ```python # 3 的补码表示(8位) a = 0b00000011 # -2 的补码表示(8位) b = 0b11111110 # 补码加法 result = a + b # 输出结果(补码形式) print(f"结果的补码表示: {result:08b}") # 转换为十进制 print(f"结果的十进制值: {result}") ``` 运行结果: ``` 结果的补码表示: 00000001 结果的十进制值: 1 ``` 该示例验证了补码加法的正确性,通过简单的加法操作即可实现减法运算[^3]。 ### 总结 补码计算机中的广泛应用得益于其统一的符号位处理、加法减法统一、零的唯一表示、扩展的数值范围以及对溢出的有效处理。这些优势使得补码成为计算机系统中最常用的数值表示方式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值