为什么要用补码表示

用补码的主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。n位计算机,设n=8,所能表示的最大数是11111111,若再加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的模为2(8)。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码[1]。
最直观的得到一个负数的补码的方法是用28去减它,例如:
-1 的补码 100000000
 -) 00000001 
------------
= 11111111 (实际上就是1 + (11111111 – 1),先计算括号内,相当于按位取反,然后再加上外面的1。
首先说说无符号数的表示,一个字节可以表示28-1=256个数,00000000~11111111 分别表示0~255。这个很简单。
对于无符号数,一个字节同样只能表示256个数,那么怎么表示负数,一个比较好的办法就是将字节的最高位表示为符号位,其余7位表示数值,表示范围为-128~127, 00000000~01111111表示0~127, 10000001~11111111表示-1~-127吗,错!,实际上是10000000~11111111分别对应表示-128~-1,怎么会是这样呢,是不是搞错了,没错的,这就是补码,负数在计算中是以补码来表示的。
那么补码是怎么得到的呢?为了说明这个问题,让我们来先了解一下什么是原码和反码的概念。
原码:数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了,原码表示范围为-127 ~ -0, +0 ~ +127,除了最高位表示符号位,正负数在其余各位的表示是相同的,例如10000001表示 -1, 11111111表示-127。原码表示虽然很简单,但人们很快就发现用原码来进行加减运算会出问题:假设字长为8bits[2]
( 1 ) 10-( 1 )10 =( 1 )10 + ( -1 )10 =( 0 )10
(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确
因为两个整数的相加没有问题,所以问题出在带符号位的负数上,人们将负数除符号位的其它位逐位取反,就得到了反码。
( 1 )10-( 2)10 =( 1 )10 + ( -2 )10 =( -1 )10
(00000001) + (11111101) =(11111110) =( -1 ) 正确
发现反码表示后,将加减数都表示成反码后,减法可以直接表示成加法,其结果似乎是正确的。但是:
( 1 )10 -( 1 ) 10=( 1 ) 10+ ( -1 ) 10=( 0 )10
(00000001) + (11111110) =(11111111) =( -0 ) 有问题.
问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的,于是就出现了补码,正数的补码不变,负数的补码是将其反码加1,这样表示后再看看上面的运算:
( 1 ) 10-( 1 ) 10=( 1 )10 + ( -1 )10 =( 0 )10
(00000001) + (11111111) =(00000000) = ( 0 ) 正确
( 1 ) 10-( 2) 10=( 1 )10 + ( -2 )10 =( -1 )10
(00000001) + (11111110) =(11111111) = ( -1 ) 正确
P.S.
一的补码(one's complement) 指的是正数=原码,负数=反码
而二的补码(two's complement) 指的就是通常所指的补码
<think>嗯,用户问的是为什么计算机中使用补码表示法及其优点。首先,我得回忆一下补码的基本概念。补码是二进制中用来表示有符号数的一种方法,对吧?记得之前学过原码、反码和补码,但具体细节可能有点模糊了。 首先,用户可能想知道补码为什么被采用,而不是原码或者反码。根据引用里的内容,比如引用[2]提到补码只有一个0的表示形式,而反码有正0和负0两种,这可能是个优势。因为计算机处理时,统一0的表示可以简化运算,避免额外的判断逻辑。这应该是优点之一。 然后,补码在加减运算上的便利性。引用[5]里说补码可以让减法转换为加法,简化运算器的设计。比如,A - B 可以转换成 A + (-B)的补码,这样计算机只需要加法器就可以完成减法,节省硬件成本。这也是补码被广泛使用的重要原因吧。 另外,溢出处理的问题。补码处理溢出可能更直接?不过具体的溢出机制可能需要进一步确认。引用[3]里提到补码的溢出情况,比如-27无法表示时会溢出。不过用户的问题可能更关注为什么补码更好,而不是如何处理溢出,所以这点可能作为优点之一。 还有符号位的处理,引用[4]提到符号位为1表示负数,这样在补码中符号位可以参与运算,不需要额外的处理。比如,原码的符号位需要单独处理,而补码可以直接运算,这也是一个优点。 需要整理这些点:统一0表示、简化加减法、符号位参与运算、硬件设计简化。引用里的多个地方都支持这些观点,比如引用[2]和[5]。 可能还需要提到补码的范围,比如n位补码可以表示-2^(n-1)到2^(n-1)-1,这样范围对称且没有重复的0,这也是优点之一。引用[3]中的例子可能涉及这点。 另外,用户可能想知道补码的历史背景或者实际应用中的例子,但问题主要聚焦在原因和优点,所以需要紧扣这些方面。 总结一下,补码的优点包括:消除+0和-0的歧义,统一加减法运算,简化硬件设计,符号位自然参与运算,扩展数值范围的有效利用。这些点需要有条理地组织,用用户容易理解的语言表达出来,并引用相关的参考文献来支持。</think>### 为什么计算机使用补码表示法及其优点? #### 1. **补码的设计目的** 补码的核心目的是**简化计算机的算术运算**,尤其是将减法转换为加法,从而减少硬件设计的复杂度。通过统一加减法运算,计算机只需实现加法器即可完成两类运算[^5]。 #### 2. **补码的主要优点** - **(1) 消除+0和-0的歧义** 原码和反码中,0有两种表示形式(例如,00000000和10000000),而补码仅有一种表示形式(00000000)。这种唯一性避免了运算中对0的额外判断逻辑[^2]。 - **(2) 符号位直接参与运算** 补码的符号位(最高位)与其他位统一处理。例如,计算$5 - 3$时,可直接转换为$5 + (-3)$的补码形式,无需单独处理符号位。运算结果会自动包含符号信息[^4]。 - **(3) 硬件设计简化** 补码允许使用**同一套电路**处理加减法,减少了硬件资源的需求。例如,减法操作$A - B$可转换为$A + (-B)$的补码加法。 - **(4) 数值范围有效利用** $n$位补码表示的范围为$-2^{n-1}$到$2^{n-1}-1$,比原码多一个负数(例如,8位补码表示-128到127)。这一特性充分利用了二进制位组合[^3]。 #### 3. **实例说明** 以8位补码为例: - 正数3的补码:`00000011` - 负数-3的补码:`11111101`(取反后加1) 计算$5 - 3$时,实际执行$5 + (-3)$的补码加法: ``` 00000101 (5) + 11111101 (-3) = 100000010 (结果截断为8位后为00000010,即2) ``` 溢出位自动丢弃,结果正确。 #### 4. **补码的应用场景** - **整数运算**:几乎所有现代计算机的CPU均使用补码进行有符号整数运算。 - **浮点数阶码**:浮点数的指数部分(阶码)常采用移码(一种变形的补码表示。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值