【笔记】二进制补码记数法

本文详细介绍了二进制补码表示法的基本原理及应用,包括正负数的表示方式、加法运算规则和溢出检测方法。通过具体实例说明了如何进行二进制加法运算,并解释了为何补码表示法适用于计算机系统的实现。

(《计算机科学概论 第11版》)
最左边一位为符号位,正数为0,负数为1;
正数从全为0开始加,负数从全为1开始减,系统所能表示的绝对值最大的数值为除符号位外都取反的值
eg.假设使用长度为4的位模式:
0111:7
0110:6
0101:5
0100:4
0011:3
0010:2
0001:1
0000:0
1111:-1
1110:-2
1101:-3
1100:-4
1011:-5
1010:-6
1001:-7
1000:-8

绝对值

从右往左读,遇到的第一个1及其右侧的数字全部复制、左侧数字全部取反,所得即为原数绝对值——因此知道正数便可以表示出它的负数来了

加法

左边产生的任何一个附加位都要删除
eg.0111(7)+1011(-5)=10010=0010(2)
它展示了二进制补码记数法的一个主要优点:任何带符号数字组合的加法都可以利用相同的算法,于是也就可以用相同的电路

溢出

检查答案的符号位就可以发现溢出的条件。如果两个正数相加得到负数,则溢出

<think>我们正在讨论二进制补码的取法和用处。根据用户提供的引用内容,我们可以总结如下: 二进制补码的取法(针对负数): 1. 保持符号位(最高位)不变。 2. 将除符号位外的所有位按位取反(0变1,1变0)。 3. 将取反后的结果加1。 例如,求-1(8位原码为10000001)的补码: - 符号位不变:1 - 其余位取反(0000001取反得到1111110):11111110 - 加1:11111110 + 1 = 11111111 所以-1的补码是11111111。 再如,引用[2]中求11011101(这是一个补码表示的数,但题目要求求它的补码?这里注意:如果11011101是一个补码,我们再求一次补码会得到原码吗?实际上,补码补码就是原码。但引用[2]的例子中,它给出的11011101是一个原码吗?根据上下文,它是在求一个数的补码,所以11011101可能是原码。注意:原码和补码的转换规则相同,都是符号位不变,其余取反加1。所以,对于负数原码,我们可以通过这个步骤得到补码;对于补码,同样操作可以得到原码。 在引用[2]中,它先求了11011101的一的补码(即反码),得到00100010,然后加1得到00100011。注意:这里11011101是一个原码(最高位为1,所以是负数),那么它的补码就是00100011吗?实际上,我们通常说的补码是包括符号位的,而11011101的最高位是1,表示负数。所以步骤正确:符号位不变(1),其余位取反(1011101取反为0100010),然后加1(0100010+1=0100011),然后符号位放回,所以应该是10100011?但引用中结果是00100011,这里可能存在问题。实际上,11011101作为原码,转换过程如下: - 原码:11011101 (最高位1表示负数) - 取反(除符号位):1011101取反为0100010 -> 符号位不变,所以是10100010 - 加1:10100010 + 1 = 10100011 所以补码应该是10100011。但引用[2]却得到00100011,这显然不对,因为它把符号位也取反了。这里引用[2]的描述可能有误。正确的做法是符号位保持不变。 再看引用[3]中的例子:-65的补码。 -65的原码(8位):11000001(因为65的二进制是01000001,所以负号为1,即11000001) 转换: 1. 符号位不变,其余取反:10111110(注意:原码11000001,取反:00111110,但符号位不变,所以是10111110) 2. 加1:10111110+1=10111111 所以-65的补码是10111111(二进制),换算成十进制是191(因为10111111的十进制是128+32+16+15=128+32+16+15=191)。但-65的绝对值应该是65,而补码10111111并不是65。这里引用[3]说明了,这个补码表示的数在计算机中就是代表-65,而我们如果要得到它的绝对值(真值),需要将补码再转换回原码(即再取一次补码): - 补码:10111111 - 取反(除符号位):符号位不变,其余取反:11000000 - 加1:11000000+1=11000001(这就是原码,即-65) 所以,补码的用处之一:计算机中负数用补码表示,可以统一加减法运算(用加法代替减法),并且0的表示唯一。 用处总结: 1. 统一加减法:减法可以转化为加一个负数(补码形式),这样CPU只需要加法器。 2. 消除0的歧义:原码中有+0和-0(00000000和10000000),而补码中0的表示唯一(00000000),并且用10000000表示-128,扩大了表示范围(8位补码可以表示-128~127,而原码只能表示-127~127)。 所以,回答用户的问题: 二进制补码的取法(针对负数): 步骤1:原码符号位不变。 步骤2:其余位按位取反(得到反码)。 步骤3:反码加1得到补码。 注意:正数的补码就是其原码。 用处: 1. 简化计算机运算:加减法可以用同一套加法电路完成。 2. 消除零的歧义,扩大表示范围(例如8位补码可表示-128~127)。 3. 方便实现逻辑电路。 生成相关问题: 1. 8位二进制补码的表示范围为什么是-128到127? 2. 如何验证一个负数的补码是否正确? 3. 补码在加法运算中是如何避免溢出问题的? </think>### 二进制补码的取法及用处 #### 🔢 一、补码的取法(以8位为例) 1. **正整数**:保持原码不变 例如:$+5$ 的二进制补码为 $0000\\ 0101$ 2. **负整数**(分三步操作): - **符号位不变**:保持最高位为1 - **数值位取反**:除符号位外按位取反(0↔1) - **末位+1**:取反结果加1 $$ \begin{align*} \text{例:-3取补码:} \\ \text{原码} &\to 1000\\ 0011 \\ \text{取反} &\to 1111\\ 1100 \quad \text{(符号位不变)} \\ \text{加1} &\to 1111\\ 1101 \quad \text{← 补码} \end{align*} $$ 3. **特殊值处理**: - **0的唯一表示**:$0000\\ 0000$ (原码的 $1000\\ 0000$ 经取反+1后也变为 $0000\\ 0000$)[^1] - **-128的表示**:直接使用 $1000\\ 0000$ 作为补码[^1] --- #### ⚙️ 二、补码的核心用处 1. **统一加减法运算** 计算机只需加法器即可完成减法: $$A - B = A + (-B)_\text{补}$$ 例如 $7-3$: $$ \begin{align*} 7_\text{补} &= 0000\\ 0111 \\ -3_\text{补} &= 1111\\ 1101 \\ \text{和} &= 0000\\ 0100 \quad \text{(即+4)} \end{align*} $$ 2. **消除零歧义** 原码存在 $+0$ ($0000\\ 0000$) 和 $-0$ ($1000\\ 0000$),补码统一为 $0000\\ 0000$[^1] 3. **扩展表示范围** | 表示法 | 8位范围 | 范围大小 | |--------|--------------|----------| | 原码 | $-127 \sim +127$ | 255个数 | | **补码** | $\mathbf{-128 \sim +127}$ | **256个数** | 4. **高效处理符号** 最高位直接表示符号: - $0$ → 正数 - $1$ → 负数 无需额外符号判断电路[^3] --- #### 🔍 三、关键特性验证 ```plaintext [验证 -65 的补码] 原码: 1100 0001 → 符号位(1) + 数值(65) 取反: 1011 1110 → 符号位不变 加1 : 1011 1111 → 补码(对应十进制191) 取绝对值:补码取反+1 → 0100 0001 (即+65)[^3] ``` --- #### 💡 四、实际应用场景 1. **CPU算术逻辑单元(ALU)**:用补码实现单电路处理加减法 2. **数据压缩**:扩展的数值范围减少存储溢出 3. **信号处理**:ADC采样值的二进制表示(如AD7960的差分输出) 4. **加密算法**:补码运算简化位操作(如AES轮函数)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值