`
sangei
  • 浏览: 334038 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

为什么要使用补码

阅读更多

转载一篇文章,留下来学习,加深下印象。

 

 问:

负数在计算机中如何表示?

 

举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢?

很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。比如,在8位机中,规定每个字节的最高位为符号位。那么,+8就是00001000,而-8则是10001000。

但是,随便找一本《计算机原理》,都会告诉你,实际上,计算机内部采用2的补码(Two's Complement)表示负数。

什么是2的补码?

它是一种数值的转换方法,要分二步完成:

第一步,每一个二进制位都取相反值,0变成1,1变成0。比如,00001000的相反值就是11110111。

第二步,将上一步得到的值加1。11110111就变成11111000。

所以,00001000的2的补码就是11111000。也就是说,-8在计算机(8位机)中就是用11111000表示。

不知道你怎么看,反正我觉得很奇怪,为什么要采用这么麻烦的方式表示负数,更直觉的方式难道不好吗?

昨天,我在一本书里又看到了这个问题,然后就花了一点时间到网上找资料,现在总算彻底搞明白了。

2的补码的好处

首先,要明确一点。计算机内部用什么方式表示负数,其实是无所谓的。只要能够保持一一对应的关系,就可以用任意方式表示负数。所以,既然可以任意选择,那么理应选择一种最方便的方式。

2的补码就是最方便的方式。它的便利体现在,所有的加法运算可以使用同一种电路完成。

还是以-8作为例子。

假定有两种表示方法。一种是直觉表示法,即10001000;另一种是2的补码表示法,即11111000。请问哪一种表示法在加法运算中更方便?

随便写一个计算式,16 + (-8) = ?

16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:

 00010000
+10001000
---------
 10011000

可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。

现在,再来看2的补码表示法。

 00010000
+11111000
---------
100001000

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

2的补码的本质

在回答2的补码为什么能正确实现加法运算之前,我们先看看它的本质,也就是那两个步骤的转换方法是怎么来的。

要将正数转成对应的负数,其实只要用0减去这个数就可以了。比如,-8其实就是0-8。

已知8的二进制是00001000,-8就可以用下面的式子求出:

 00000000
-00001000
---------

因为00000000(被减数)小于0000100(减数),所以不够减。请回忆一下小学算术,如果被减数的某一位小于减数,我们怎么办?很简单,问上一位借1就可以了。

所以,0000000也问上一位借了1,也就是说,被减数其实是100000000,算式也就改写成:

100000000
-00001000
---------
 11111000

进一步观察,可以发现100000000 = 11111111 + 1,所以上面的式子可以拆成两个:

 11111111
-00001000
---------
 11110111
+00000001
---------
 11111000

2的补码的两个转换步骤就是这么来的。

为什么正数加法适用于2的补码?

实际上,我们要证明的是,X-Y或X+(-Y)可以用X加上Y的2的补码完成。

Y的2的补码等于(11111111-Y)+1。所以,X加上Y的2的补码,就等于:

X + (11111111-Y) + 1

我们假定这个算式的结果等于Z,即 Z = X + (11111111-Y) + 1

接下来,分成两种情况讨论。

第一种情况,如果X小于Y,那么Z是一个负数。这时,我们就对Z采用2的补码的逆运算,求出它对应的正数绝对值,再在前面加上负号就行了。所以,

Z = -[11111111-(Z-1)] = -[11111111-(X + (11111111-Y) + 1-1)] = X - Y

第二种情况,如果X大于Y,这意味着Z肯定大于11111111,但是我们规定了这是8位机,最高的第9位是溢出位,必须被舍去,这相当于减去100000000。所以,

Z = Z - 100000000 = X + (11111111-Y) + 1 - 100000000 = X - Y

这就证明了,在正常的加法规则下,可以利用2的补码得到正数与负数相加的正确结果。换言之,计算机只要部署加法电路和补码电路,就可以完成所有整数的加法。

转自

http://blog.csdn.net/gaochizhen33/article/details/7161417

 

 

另记载下反码的规律

~ (反码): 01001 ~ 后 10110,即1变0 , 0变1
6反码结果是-7, 整数a的反码结果= -a -1
(~6) = -7
  -6 = -7 + 1;
(~8) = -9:-8 = -9 + 1;
(~16) = -17:-16 = -17 + 1;

~(-6)= -(-6)-1=5 ;
 (~a)先把a变为-a,-a - 1 = (~a);

 

 

分享到:
评论

相关推荐

    Java为什么使用补码进行计算的原因分析

    比如,要计算-4 + 3,如果使用原码表示,需要考虑正负号和进位,而补码则可以直接进行加法运算,因为3的补码和原码相同。计算-4(10000000 00000000 00000000 00000100)加上3(00000000 00000000 00000000 00000011...

    vi.zip_16进制补码_Labview 进制_labview 二进制_labview补码_二进制补码

    例如,可以使用“字符串到数值”函数将16进制字符串转换为数值,再利用“位操作”节点进行原码、反码和补码的计算。对于负数,LabVIEW会自动使用补码表示。如果需要显示或处理这些数值,可以使用“数值到字符串”...

    为什么需要反码和补码?.docx

    转换补码为原码的过程对于负数来说稍微复杂一些。负数的补码被视为负数的原码,然后对这个补码再次求补,即符号位不变,其余各位取反并加1。这将恢复负数的原始二进制表示。 总之,原码、反码和补码是计算机中表示...

    计算机补码

    什么是补码? 补码是一种特殊的二进制编码方式,用于表示有符号整数。它与原码不同,原码是将符号位和数值位分开表示,而补码则将符号位和数值位组合在一起。 正数的补码 正数的补码与原码相同。例如,+9 的补码...

    Verilog中的有符号计算之认知补码

    要想在FPGA的世界里随心所欲的进行有符号运算,必须先对补码有一个很好的认知。本文将详细介绍Verilog中的补码计算、有符号计数和FPGA的有符号计算。 Verilog中的补码计算 在Verilog中,补码计算是一种重要的概念...

    二进制补码、小数的补码及运算规则

    补码的主要特点是:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。补码的表示方法是在原码的基础上进行修改,原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为 0,...

    补码源码反码转换工具,补码反码原码的转换工具,C/C++

    在计算机系统中,通常使用补码来存储和处理有符号整数。 4. **MFC(Microsoft Foundation Classes)**: MFC是微软提供的一个C++类库,它提供了对Windows API的封装,使得开发者能够更容易地构建Windows应用程序。...

    C#补码加法运算代码

    - **初始化与断言**:首先对输入参数进行有效性检查,确保 `num1` 和 `num2` 不为空且长度至少为2,符合补码运算的基本要求。 - **加法模式处理**:当 `addMode` 等于2时,需要对 `num2` 进行取反操作,即计算 `num2...

    补码阵列乘法器

    2、输入为两个4位含符号位的补码数,输出结果亦是含符号位的数补码。 图7带求补级的阵列乘法器方框图 要求: 1、能够正确输入两个4位(含符号位)的补码,并通过计算得到正确的结果。 2、验证结果,输入两个均为...

    原码补码转换的matlab程序

    将原码转换成补码,再将补码转成原码的matlab程序

    原码转补码(逻辑门实现)

    在这个实验中,我们可以使用硬件描述语言(如VHDL或Verilog)编写代码,描述原码转补码的逻辑,然后通过编译器将其编译为FPGA可以执行的配置。 通过这样的实验,学生不仅能理解原码和补码的概念,还能掌握逻辑门的...

    关于补码以及基本的补码运算

    - 为了实现高效的补码乘法,可以使用不同类型的全加器。 - 例如,0类全加器没有负权输入,而1类全加器有一个负权输入和两个正权输入。 - 这些不同类型的全加器可以根据输入的权值来进行优化配置,从而提高乘法...

    补码工具.rar

    如果要编写涉及低级操作的组件或接口,如与硬件直接交互,或者优化性能关键部分的代码,对补码的理解就显得尤为重要。 在提供的"补码工具"中,可能包含了一些实用的程序或函数,帮助开发者直观地理解和操作补码,...

    计算机基础知识:原码反码补码练习(含答案)

    对于(x-y),先将x和y的补码相减,得到01001110,这表示x-y的结果是+110,因此(x-y)补码为01001110。 了解这些基础知识对于进行计算机编程、内存管理、硬件设计等IT工作都非常重要,特别是在处理数值运算时,理解和...

    二进制补码加法器实验1

    例如,加法实验中,输入7和15的补码,得到的和为22的补码,转换为原码为2。减法实验中,输入-8和-5的原码,通过补码运算得到-3的原码。这些结果验证了补码加法器的正确性。 实验后的分析表明,学生通过实际操作不仅...

    matlab_用于2s补码到十进制转换器的源代码

    本文将深入探讨2s补码的概念,以及如何使用MATLAB实现2s补码到十进制的转换。 首先,让我们理解2s补码的工作原理。对于n位的2s补码,最大的正数表示为1111...1111(n个1),而最小的负数表示为1000...0000。正数的2...

    十六进制补码计算器.exe

    包括两部分 16位数 16进制补码计算和32位 16进制补码计算器

    计算机组成原理补码计算

    若最高位为1,则表示负数,如1000 0001表示-1,它的补码就是其原码,因为-1的反码是1111 1110,加1后仍然是1000 0001。 在C++中编写补码运算的程序,我们通常会用到位运算符,如按位与(&),按位或(|),按位异或(^)...

    计算机中的补码是什么?.docx

    那么,为什么要有补码?补码的优点是什么?补码的出现是为了解决符号数表示的问题。符号数可以分为正数和负数两种,而原码和反码都无法处理负数的问题。补码的出现解决了这个问题,使得计算机可以正确地表示和处理...

    原码反码补码讲课.pptx

    补码表示法的优点是加法与减法运算规则统一,没有“-0”,可以表示的数比原码多一个,但是它的缺点是不直观,人使用不方便。 带符号整数在计算机中的表示方法有很多种,而补码表示法是计算机中最常用的表示方法,它...

Global site tag (gtag.js) - Google Analytics