我们知道,计算机只认识0和1[为什么计算机只认识0和1],现实世界中的内容,无论是文字、音频、视频等等想要通过计算机存储、计算或者展示,都需要转换二进制。

就像你刚刚唱的旋律,想要存储在计算机中也是要转成二进制的。

那么,最简单的一个数字,想要在计算机中表示出来,就需要通过一定的手段将他转换成二进制。而这种手段我们称之为编码方式。

原码

相信很多人在上初中的时候都学过很多方式把一个十进制数转成二进制数,比如我们可以很快速的知道10的二进制可以表示成 1010 。

但是初中老师没有告诉我们的是:-10 如何表示呢?

为了在计算机中想办法表示负数。于是人们想出来一种办法:

在二进制数值前面增加一位符号位(即最高位为符号位):正数该位为0,负数该位为1,其余位表示数值的大小。

这样,如果我们想要10的话,那么就应该是:0 1010,想要表示-10的话,就应该是1 1010。

这种编码方式被称之为原码,原码的优点比较明显,那就是非常的简单直观,很容易被人理解。

使用原码,解决了十进制在计算机中的存储问题,但是计算机中还有一个重要的操作那就是计算。使用原码如何计算呢?

首先,原码对于加法的运算是没什么问题的,如5 + 2

对应的二进制运算:0 0101(原) + 0 0010(原) = 0 0111(原) 其对应的十进制是 7。

加法没什么问题,那么我们再试着用原码来计算减法,例如我们想要计算10 - 2:

那么就是 0 1010(原) - 0 0010(原) = 0 1000(原),那么这个二进制对应的十进制刚好是8。可见原码计算减法没有问题的?

但是,以上运算只是我们一厢情愿的算法,其实计算机算术逻辑单元(ALU)并没有直接进行减法运算,对于减法,其实也是用加法器来实现的

也就是说,计算机中的所有的减法运算都需要转换成加法运算,那么10 - 2其实就是10 + (-2)

他们的二进制 0 1010(原) + 1 0010(原) = 1 1100(原) ,得到的结果考虑他的符号位的话,这个值是-12,这明显是错误的!!!

可见,原码虽然对于人类来说是比较简单直观的,但是对于计算机来说却带来了很大的计算难度。

反码

因为原码虽然容易被人理解,但是给计算机的计算带来了一定的困难,尤其是减法的运算。所以,人们发明出反码来解决减法运算的问题。

反码是基于原码计算得来的,表示方式是:正数的反码是其本身。负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

如,10 的 原码为 0 1010 ,那么他的反码同样也是 0 1010 。

如,-2 的原码为 1 0010 ,那么他的反码为 1 1101 。

有了反码之后,二进制的运算就可以带着符号位一起了。并且可以直接将减法转换成加法进行运算。但是使用反码进行运算,需要注意以下几点:

  • 反码运算时,其符号位与数值一起参加运算。

  • 反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加(循环进位)。

  • 用反码运算,其运算结果亦为反码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求反才是其真值。

如 10 - 2 的在计算时需要转成 10 + (-2)进行计算:

0 1010(反) + 1 1101(反) = 0 0111(反) + 1(进位) = 0 1000 ,因为符号位是0,表示正数,所以他对应的原码也是0 1000(原),则十进制值为8。

那么,我们再来计算法 2 - 10 ,把2 - 10转换成 2 + (-10)进行计算:

0 0010(反) + 1 0101(反) = 1 0111(反),因为符号位是1,表示负数,所以他对应的原码也是1 1000(原),则十进制为-8。

以上,我们通过几个例子展示了反码,我们知道使用反码进行计算的时候,可以带着符号位一起计算,只需要在计算之后再将反码转换成原码,再计算其对应的十进制就可以了。

但是,反码运算还是有一个小问题,我们看一下下面这个例子:

我们尝试计算10 - 10 ,即 10 + (-10):

0 1010(反) + 1 0101(反) = 1 1111(反),因为符号位是1,表示负数,所以他对应的原码也是1 0000(原),则十进制为-0。

虽然很多人够能够理解+0和-0其实是一样的,但是0带符号仍然是没有任何意义的。

如果一台计算机有8位,我们想要用反码表示0的话,就有0000 0000和 1111 1111两种方式,分别表示+0和-0。

补码

虽然反码解决了减法的问题,但是对于0的符号问题却没有解决,于是补码出现了。

补码是在原码和反码的基础上衍生出来的,补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反,最后+1。(即在反码的基础上+1)

补码计算的规则:

  • 补码运算时,其符号位与数值一起参加运算。

  • 补码的符号位相加后,如果有进位出现,则进位被舍弃。

  • 用反码运算,其运算结果亦为补码。在转换成原码时,如果是正数,其补码就是原码;如果是负数,该补码的补码就是其原码。

我们再来用补码的方式,来计算下10 - 10 :

01010(补) + 10110(补) = 0 0000 (补),因为符号位是0,表示正数,所以他对应的原码也是0 0000(原),则十进制为0。

有了补码,0的表达方式就唯一了,如果是8位的话,那么就是固定的0000 0000。

如果使用原码或者反码,8位的原码或者反码能表示的最小数字是-127,而使用补码,能表示的最小数字是-128。

可见,使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数。这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]。

使用补码的原因

通过以上介绍,我们知道了原码、反码和补码的一些知识,我们尝试着总结下为什么计算机中会最终选择补码来进行存储和计算数字。

1、计算机的运算器为了实现简单,倾向于在运算过程中将减法转换成加法,统一使用加法运算器进行计算。想要把减法转化成加法运算,就需要在运算时带着符号一起运算,而反码和补码可以带符号位一起运算,也就方便了将减法转换为加法。

2、采用补码,可以解决编码中有+0和-0两种表示0的方式。

3、补码表示的数字范围要比原码和反码大。如8位2进制,使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]。

关于作者漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

醉了!吃着火锅哼着歌,男朋友强行给我科普什么是补码!相关推荐

  1. 李彦宏说吃着火锅唱着歌,奔驰你却要我命!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 作者 | 阿司匹林.明明.费棋 本文经授权转自「AI 科技大本营」 [CSDN 编者按]昨个 ...

  2. 李彦宏谈无人车:高速上吃着火锅唱着歌,再有三五年能代替司机

    允中 整合编辑 量子位 出品 | 公众号 QbitAI △ 全国政协委员李彦宏在"委员通道"接受采访.人民网记者 于凯 摄 今天上午,全国政协十三届一次会议在北京人民大会堂闭幕.全 ...

  3. 兰州现超级“牛大”碗比腰粗:牛肉面吃出火锅范

    图为食客单人挑战"超级牛大". 魏建军 摄 图为食客单人挑战"超级牛大". 魏建军 摄 中新网兰州1月23日电(记者 魏建军)近日,兰州一款"超级牛大 ...

  4. 强人教你吃自助火锅(转载)

    [ 以下文字转载自 Food 讨论区 ] 自助火锅是对火锅爱好者的公然挑衅.交几十零八块钱,随便你吃,凡是别的店里有的 我这里都有,凡是你想吃的你都可以随意,这种形式一上来就搞得很嚣张.往往有禁不 起 ...

  5. 吃自助火锅的最高境界

    1,排空肚子,最重要!身体是革命的本钱! 2,只吃贵的,不吃对的: 3,水少喝,不喝最好!要喝,等到吃到尾声再喝,而且不要喝廉价饮料,要喝就喝咖啡,再苦再甜都没关系!我结尾 时可以连喝三杯,我一朋友可 ...

  6. 【纪中受难记】——Day15:今晚吃烧烤(最后吃了火锅)

    明天又有假放,考的怎样无所谓了. 40/20/20 [NOIP2013模拟联考3]库特的向量(code) (Standard IO) Time Limits: 1000 ms  Memory Limi ...

  7. 逼自己玩命学了3个多月,整理出了这份549个分支的技术脑图,分享给你

    出去面了一轮,投的[P6 Java资深开发工程师],整整2个小时都在聊技术,整个人被榨得一干二净,总觉得自己这几年已经挺 OK 了,但一轮面试下来,发现除了技术壁垒有待突破,更重要的是思维层面还要学很 ...

  8. 火锅尝后感,桌面虚拟化服务真的很重要

    周二晚上终于要和几个一直未曾谋面的网友接上头了 !接头的地点--我们找了一家离大家都相对比较近的生态鱼火锅店(朋友推荐,说这儿味道不错,而且新店开张,打75折 J).因为我们几个同事到得早了些,就提前 ...

  9. OSChina 周二乱弹 ——大人说话,小孩子插什么嘴!

    2019独角兽企业重金招聘Python工程师标准>>> @七念 : 听说基友过段时间要离开北京了, 心里空荡荡的.... 忽然看到了一个动弹很适合你哟, @zheng_chao : ...

最新文章

  1. openlayers2中selectcontrol用法
  2. 微服务架构方案 springBoot+dubbo
  3. printf的使用和test的使用
  4. CentOS查看CPU信息
  5. 数据结构与算法之堆排序
  6. Spark Streaming揭秘 Day16 数据清理机制
  7. OpenCV计算机视觉实战(Python版)_002图像基本操作
  8. 最大似然估计(MLE)的一些公式与定理(python实践)
  9. python代码编辑教程_python教程:pycharm编写代码的方式教学
  10. Nginx 配置 SSL 证书 + 搭建 HTTPS 网站
  11. 安装VMware tools好处
  12. 【评价模型】层次分析法(AHP) 个人总结 续更
  13. excel批量删除所有空白行
  14. 开发一款游戏引擎需要的知识与技术
  15. IntelliJ IDEA 单词表--01
  16. WINDOWS的远程桌面。
  17. 带搜索功能的GridView控件
  18. 景驰纠纷后续:潘思宁7月才发现法人被非法变更
  19. 人力资源之选人方法学习笔记_职位胜任素质模型
  20. X射线爆炸物及毒品探测技术研究

热门文章

  1. oracle 10.2.0.1 升级 10.2.0.5,Oracle10.2.0.1RAC 升级 Oracle10.2.0.5案例分享 -DATABASE篇
  2. android全局计时_Android定时器AlarmManager
  3. Qt::Window 独立窗口
  4. 官网下载的mysql密码忘了怎么办_MySQL密码忘了怎么办?MySQL重置root密码方法
  5. 数据结构之外部排序:最佳归并树
  6. (数据库系统概论|王珊)第九章关系查询处理和关系优化-第二节:查询优化
  7. C++11 并发指南六( atomic 类型详解二 std::atomic )
  8. Python 进程锁使用
  9. centos查看yum包所有版本(查看包版本)
  10. Python url中提取域名(获取域名、获取顶级域名、tldextract)