美文网首页
二进制的原码、反码和补码

二进制的原码、反码和补码

作者: HUTA1999 | 来源:发表于2019-01-17 13:08 被阅读137次

本文内容约 1700 字,本文最先在公众号:善始者實繁克終者蓋寡中发出。想要获取到最新的信息,请添加公众号以获得最好的阅读体验。

目录

  • 反码

  • 补码

    • 重新回来

    • 如何得到补码?

    • 补码转为十进制

    • 补码系统的数字表示方式

    • 补码系统的用处

    • 补码的原理

  • 参考内容

重新回来

目前是一名在校的大一学生,有时想写些内容出来,但苦于脑子里没东西。提笔又落笔,迟迟没有内容产出。想起之前我还在这个公众号里立下说:每天一篇文章。诶,又抬头看了看这个公众号的名字,诶。

接下来,打算重拾公众号,尝试输出内容。另外,公众号的介绍也修改了:

前端初学者、设计门外人,一切才刚刚开始…

经过一段时间的思考和了解后,我把自己定位为「全栈偏前端软件工程师」,但是毕竟这条路没有走过,具体能走到哪一步,未来具体如何不是很清晰。不过现在先踏踏实实从前端入手,一点点搭建自己的神经网络。

本篇内容讲一讲计算机的一些基础:

反码

简单说:

  • 正数的反码等于其原码。

  • 负数的反码,是保留其符号位后,其余各位原码的数值取反的结果,也就是 0 变为 1,1 变为 0。

补码

在计算机系统中,数值一律使用补码来表示和存储。

1、如何得到补码?

简单说就是把原二进制码,先按位取反(0 变 1,1 变 0)后,再加 1。

下面用「有符号 4 位二进制」来举个例子:


二进制到补码.png

最后的结果可以看到,这个数字的最高位为 1,确实是负数。一个正数的补码也就是相对应的负数。要是我们反过来运算:

补码到二进制.png

也就是一个负数的补码就是其对应的正数

补码转为二进制原码,也可以先减 1,再取反。

简单总结为:a 的补码就是 -a (a 可以是正负数)

不过有两个数的补码等于本身:一个是 0,另一个是该「有符号位的二进制」所能表示的最大负数(100……)

2、补码转为十进制

直接举例说明:


补码转十进制.png

补码转十进制的规则,也就是除了「最高位」外,「其他位」对应数字的处理和一般二进制相同。如果「最高位」为 1,那么它表示的数字为 -2^(n−1),n 代表位数,最终将各个结果相加就是十进制数了。

3、补码系统的数字表示方式

上面举例介绍了如何得到补码。现在来说说「补码系统」中的数字是如何表示的:

  • 正数0:补码数字与二进制一样,同时最高位的为 0。

    • 所以 4 位的最大补码正数为 0111(7)
  • 负数:得到补码的步骤上文提过了,这个数字的最高位为 1。

    • 所以 4 位的最小补码负数为 1000(-8)

那么补码数字所能表达的数字范围为:


最大最小.png

比如 8 位的补码数字,可以表示范围为:-128~127。

为什么最大值要减去一个 1?有符号位的 n 位二进制可以用来表示两组数,一组是大于等于 0,另一组小于 0。

因为 0 的存在,所以需要减去一个 1。

4、补码系统的用处

不是说计算机是用二进制的吗?干嘛要搞一个「补码系统」?

补码系统的最大优点是可以在处理加减乘除法只用一种加法电路

我们先来试试用反码来计算减法:

反码减法.png

答案正确啊。那我们继续看看反码特殊情况

反码减法二.png

这就出现问题了,出现了 -0 这种情况。虽说 -0 和 +0 应该都是 0。但是 0 带着符号是没有任何意义。

解决这个问题,就需要补码了:

补码减法.png

正好可以计算出 -1 这个答案。

这里没有演示原码的减法,你不如动手去试试。

5、补码的原理

维基百科中是这样说的:

指定 n 位长,那么就有 2^n 个可能的值,加减法运算都存在上溢出下溢出的情况,实际上都等价于「模 2^n」的加减法运算。这对于 n 比特无符号整数类型或是 n 比特有符号整数类型都同样适用。

嗯。

看了一堆写原理资料,还是没怎么搞懂,总之原理和余数的思想有关。

所以我现在所处的阶段是:知其然,「知其所以然」得还不怎么透彻。

但是我还是要讲一讲。

看了阮一峰的网络日志《关于2的补码》这一篇文章后,觉得文章中的解释还是十分清晰的。那我就用几张图来说明一下。在一个 4 位的二进制中,进行 5 - 6 的运算,我们可以把 5 - 6 转化为 5 + (-6)

5 + (-6).png

我们已经分别知道 5 和 6 的原码,要得到 -6 我们可以用 0 - 6 得到 -6 的二进制码:

0-6.png

但是 0 根本不够减啊。那我们想想,在做十进制减法的时候,要是这一位不够减,怎么办,答案是问上一位借一个 1。那 0000 去借一位 变为 1 0000

1000-0110.png

我们又注意到,1 0000 其实是可以用 1111+ 1 来表示的,那把算式变为:

补码原理最后一步.png

第一步操作就相当于是按位取反,第二步再 +1,这个过程和得到反码的步骤完全一致。

参考内容

白底.png

相关文章

  • python中的原码反码和补码

    python中的原码反码和补码 原码反码和补码的概念 原码:原码是二进制数字的一种简单的表示法。二进制首位为符号位...

  • 二进制原码、反码、补码运算及标志位

    一、二进制原码、反码、补码的转换 原码: 正整数的原码:这个数的二进制,符号位为0;正整数的原码=补码=反码 例1...

  • 原码、反码、补码

    正数 原码:一个数的二进制 反码:正数的反码就是其原码 补码:正数的补码就是其原码 例 负数 原码:一个数的二进制...

  • 原码、反码、补码和移码

    书中关于原码、反码、补码和移码的定义如下(n是机器字长):原码: 反码: 补码: 移码: 原码, 反码, 补码的基...

  • 《Oracle Java SE编程指南》07-09:原码、反码和

    内容导航: 前言 1、原码 2、反码 3、补码 前言 原码、反码和补码是计算机存储一个具体数字的二进制编码方式。 ...

  • 位运算

    原码,反码,补码 原码 正数的原码就是其二进制本身 负数的原码是把对应的正数的原码最高位改为1 反码 正数的反码就...

  • 计算机为什么要使用原码、反码、补码

    1. 什么是原码、反码、补码 先看一个例子: +1和-1的原码、反码、补码的表示 原码、反码、补码的计算方式如下:...

  • Java 二进制

    原码、反码、补码 二进制的最高位是符号位, 0表示正数, 1表示负数; 正数的原码, 反码, 补码都一样; 负数的...

  • 软件测评师做题技巧

    第一类补码,反码,原码 正数:原码=反码;补码=原码负数:反码=原码求反;补码=反码+1 第二类用例概率的计算 测...

  • 2018-10-22 Python31 原码、反码、补码

    原码、反码、补码 1)如何计算补码?规则: 正数:原码 = 反码 = 补码负数:反码 = 符号位不变,其他位取反补...

网友评论

      本文标题:二进制的原码、反码和补码

      本文链接:https://www.haomeiwen.com/subject/svqidqtx.html