关于二进制补码

关于二进制补码最近把大学期间没弄清楚的二进制补码理清了 谢谢网络 谢谢阮大牛 以下内容复制于阮一峰的博客 源地址链接问一个基本的问题 负数在计算机中如何表示 举例来说 8 在计算机中表示为二进制的 1000 那么 8 怎么表示呢 很容易想到 可以将一个二进制位 bit 专门规定为符号位 它等于 0 时就表示正数 等于 1 时就表示负数 比如 在 8 位机中 规定每个字节的最高位为符号位 那么

最近把大学期间没弄清楚的二进制补码理清了,谢谢网络,谢谢阮大牛…

以下内容复制于阮一峰的博客,源地址链接



问一个基本的问题。

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

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

很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。

比如,在8位机中,规定每个字节的最高位为符号位。那么,+8就是00001000,而-8则是。

但是,随便找一本《计算机原理》,都会告诉你,实际上,计算机内部采用二进制补码(简称补码也行)表示负数。


什么是二进制补码

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

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

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

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

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

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


二进制补码的好处

首先,要明确一点。计算机内部用什么方式表示负数,其实是无所谓的。只要能够保持一一对应的关系,就可以

用任意方式表示负数。所以,既然可以任意选择,那么理应选择一种最方便的方式。

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

还是以-8作为例子。

假定有两种表示方法。一种是直觉表示法,即;另一种是二进制补码表示法,即。请问哪一种表示法在加法运算中

更方便?

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

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

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


可以看到,如果按照正常的加法规则,就会得到的结果,转成十进制就是-24。显然,这是错误的答案。也就是说,在这

种情况下,正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加

负数。从电路上说,就是必须为加法运算做两种电路。

现在,再来看二进制补码表示法。

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


可以看到,按照正常的加法规则,得到的结果是。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,

因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。

说明了,二进制补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。


二进制补码的本质

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

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

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

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

因为00000000(被减数)小于0000100(减数),所以不够减。请回忆一下小学算术,如果被减数的某一位小于减数,我们怎么办?

很简单,问上一位借1就可以了。

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

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


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

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





二进制补码的两个转换步骤就是这么来的。


为什么正数加法适用于二进制补码

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

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

X + (-Y) + 1

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

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

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

所以,Z = -[-(Z-1)] = -[-(X + (-Y) + 1-1)] = X – Y

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

。所以,Z = Z – = X + (-Y) + 1 – = X – Y

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

路,就可以完成所有整数的加法。

还有一种证明方法:

Z = X + (-Y) + 1式子可以写为Z = X – Y +,这在硬件上可以理解为两部分电路来实现,第一部分是前面的X –

 Y(这里姑且不管计算的结果是正还是负),第二部分是X – Y计算的结果再和相加,最终得到计算的结果Z, 

而在8位的计算机上是不能出现的,其实这时就相当于00000000(舍去了最高位),然后我们再看一些计算的过程:

Z = X + ( – Y) + 1
= X – Y +
= X – Y + 00000000
= X – Y


证毕。

这样我们就证明了X-Y或X+(-Y)可以用X加上Y的二进制补码完成,而不必分两种情况来证明。



顺便扯点别的,以下是关于为什么一个字节的范围是-128~127的个人看法,如不正确请指正:

假如是8位有符号的byte类型的数值,那么理应不存在-128,但是恰好-128的补码是-0,

并且计算机中负数有对应的补码就可以进行运算,表示0的有+0就够了,

所以-0被拿来表示-128的补码,因此,负数有-128,而正数只有127。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176292.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午10:17
下一篇 2026年3月26日 下午10:17


相关推荐

  • 赵青-《剑侠情缘网络版》开发回顾

    赵青-《剑侠情缘网络版》开发回顾赵青-《剑侠情缘网络版》开发回顾 赵青-《剑侠情缘网络版》开发回顾,(转自剑网1,作者应该是原剑网3技术总监)这篇文章首发于一本谈游戏研发的杂志,是赵青写的,写得非常不错。《剑侠情缘网络版》开发回顾2003年的1月,我刚刚开发完《天王》项目,正在休息、总结和规划下一个项目。《天王》是我开发的众多项目中最满意的一个,虽然这篇文字主要是对《剑侠…

    2022年7月19日
    15
  • 若干道Swift面试题

    1,说说你认识的Swift是什么?Swift是苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于MACOS和iOS平台,用于搭建基于苹果平台的应用程序。

    2021年12月23日
    61
  • ExecuteNonQuery()返回值问题[通俗易懂]

    ExecuteNonQuery()返回值问题[通俗易懂]1.使用update,insert,delete等对数据库中表行进行操作的时候,返回值为所操作的行数(若该条语句未作用在任何一行,则返回0)2.使用alter添加表空间数据文件,create创建表,drop删除表等操作时返回值为03.数据库连接字符串http://blog.csdn.net/cddchina/article/details/46046

    2025年10月31日
    2
  • N70常用软件大集合

    N70常用软件大集合管理软件[文件管理]SmartFilemanv1.03汉化版[进程管理]AppManv1.04完美简体中文优化MMC绿色版[文件管理]SystemExplorerv1.8汉化版[程序管理]Fexplorerv1.15完美汉化完全版《N70拨号大字体》+《N70解决opera8.5上网一些地方显示口口的字体》英文机N70用的完美中文字体[压缩工具]解压利器zipman2.

    2022年7月11日
    27
  • Netbeans安装教程

    Netbeans安装教程准备工作:电脑安装完JDK能翻墙的浏览器开始:假如没有安装JDK,可以看我写的如何安装JDK1.8.0_101在Oracle官网上下载NetBeans选择相应的版本下载,按照箭头指示方向,即点击AcceotLicenseAgreement然后选择适合自己电脑的版本Windowsx64右面的下载地址建议将安装包放在D盘,新建Netbeans…

    2025年8月20日
    3
  • Java 如何将String转化为Int

    Java 如何将String转化为Int在 Java 中要将 String 类型转化为 int 类型时 需要使用 Integer 类中的 nbsp parseInt 方法或者 nbsp valueOf 方法进行转换 例 1 String nbsp str nbsp nbsp 123 try nbsp nbsp nbsp nbsp nbsp int nbsp a nbsp nbsp Integer parseInt str nbsp catch

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号