如何你看到了这篇文章,想必你应该是一个爱思考,善于学习的人!
我们经常说:补码=反码+1,但为什么要这样去定义补码呢?补码,反码被早期计算机学家设计出来的目的是什么呢?
下面我们就对上面的问题进行详细解答。
ps:以下的举例都用8位二进制。

1.原码的诞生,原码的弊端

  • 原码诞生
    我们都知道,对于计算机只识别0和1,那么我们如何用计算机中二进制去表示我们生活中的十进制数字呢?
    首先,对于生活中十进制的正数,我们计算机中的二进制可以很好的表示出来,比如18就是0001 0010;
    对于十进制负数,我们二进制该如何去表示呢,在计算机中可没有负号(-),那么我们该如何规定负数呢?
    这时我们发现二进制的最高位很少被用到,所以这个时候我们想到了用二进制的最高位去表示符号位,0代码为正,1代表为负,正好与正负相对应。
    于是以前的学者们就把上述的规定叫做原码。

  • 原码的弊端
    在我们生活中,十进制的每一个正数,都存在着与之对应的负数,它们相加等于0,即它们是相反数。(比如1和-1)。
    那么在二进制中,如果用原码表示,我想找到正数0000 0001的相反数,大家理所当然的会想到是1000 0001,这谁想不到呀,这么简单!但是你是否想过,如果让其0000 0001与1000 0001直接相加,其结果是否为二进制0000 0000所表示的0呢?它们相加结果是1000 0010,显然结果不等于0,这有悖于我们的生活中的原理。

2.反码,补码的诞生,为什么定义补码等于反码加一

在上述问题中,二进制原码表示的正数与十进制的正数是很好转换的,那么我们如何根据二进制表示的正数去得到一个对应的负数,让他们相加的结果为0呢?
在用原码表示的8位二进制中,我们都知道1111 1111+0000 0001等于1 0000 0000结果溢出了,计算机在识别的时候只会识别后8位,第9位的1是不会识别出来的,也就是说在8位二进制当中1 0000 0000 与0000 0000 是相等的,其结果也是0。
知道了这个一点之后,我们接下来原码的相反数:
按照我们生活中的思维,
原码+相反数=0000 0000
相反数 = 0000 0000 - 原码
在8位二进制中,把我们得出来的结论 0000 0000与 1 0000 0000相等的结论用上,变成如下式子:
相反数 = 1 0000 0000 - 原码
相反数 = (1111 1111 + 0000 0001 )- 原码
相反数 = 1111 1111 - 原码 + 0000 0001
相反数 = (1111 1111 - 原码 )+ 0000 0001
看到这里我相信大家应该会感觉有点那味了,1111 1111 - 原码 是什么呢,这个不就是每一位都与原码相反的二进制数吗,我们的学者把它称为反码,反码反码,不就是每一位都与原码相反的二进制数吗。(比如原码为0101 0101 的二进制数,带入1111 1111 - 原码 这个式子中得 1111 1111 - 0101 0101 = 1010 1010 ,0101 0101 的反码是 1010 1010)
把刚刚得到的结论带入上式,
相反数 = 反码 + 0000 0001
看到这一步大家是不是觉得更加有那味了,为了不把相反数这个名词与反码弄混淆,我们在二进制中取了一个新的名字补码用来代替生活中的相反数一词,当然这都是翻译过来的名词。最后我们得到如下表达式:
补码 = 反码 + 0000 0001
补码 = 反码 +1
以上例子是以8位二进制为例来说明的,当然16,32位甚至更高位的二进制数其推理过程与之类似。

目前我们的计算机基本上都是以补码的格式进程存储二进制数,以补码的形式进行运算二进制数,这符合我们的逻辑思维,也加快的计算机的运算速度。

以上是个人的思考,如果有误,还请大牛指出!

为什么定义补码等于反码加一,知其所以然相关推荐

  1. 深入理解 原码,反码,补码——证明补码等于反码加1

    文章目录 前言 利用同余数 直接得到 补码 同余数 推导 总结 从原码到反码到补码 原码 反码 反码的问题 解决反码出错的式子 总结 补码 补码解决了跨越问题 为什么补码等于反码+1 前言 根据冯~诺 ...

  2. 两数之差的补码等于被减数的补码与减数相反数的补码。_二进制的原码、反码、补码...

    一.十进制与二进制的相互转换 1. 十进制转换为二进制,分为整数部分和小数部分. 整数部分采用除2倒取余法,具体做法:用2去除十进制整数,可以得到一个商和余数:在用2去除商,又会得到一个商和余数,如此 ...

  3. python基础运算符讲解(原码、补码、反码)

    Python 1.Python基础 python是一门弱类型(PHP,python,Javascript,ruby)的语言,变量的类型不固定,当输入值是什么类型时,变量就会变成什么类型. 那什么是强数 ...

  4. java 的原码、补码、反码小总结

    先看一个代码吧: int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 这个应该很熟悉吧,是 ja ...

  5. int类型在计算机中的储存(原码、补码、反码)

    int类型在计算机中的储存 说起,int类型在计算机中的储存,首先要解释的就是原码.补码.反码这三个概念了.因为计算机内部储存的都是补码. 原码 对于int类型来说,这里我们按照常见的四个字节讲解,四 ...

  6. Java中0xFF是什么意思?计算机的原码、补码和反码

    公司项目中有向MCU发数据的代码,新来的同事对其中的& 0xFF很不理解,我解释了很多遍他还是蒙圈状态,可能我的表达能力太差,想想还是用一篇博客来详细说明吧,代码如下: 更新:07月10日,有 ...

  7. 负数的补码为什么是反码加1

    背景知识: 原码,反码,补码,'移码',反码只是原码转变成补码的一个中间状态值,在计算机中无其他用处. 正数的原码,反码,补码相同. 负数的反码是原码取反(符号位不变),负数的补码是其反码加1(符号位 ...

  8. 计组—原码、补码、反码、移码复习

    进制之间的转换(略) unsigned integer (无符号整数) 1. 8位二进制数表示的范围:2^8-1 (减1位二进制的减法运算) 解析:8位二进制数所表示的范围为:00000000 ~ 1 ...

  9. 二进制运算以及源码、补码、反码概念讲解

    前言 在学习框架源码底层时,有非常多的二进制运算,由于大学学习计算机基础时开小差,没有学习牢固,所以在看底层源码的算法逻辑时遇到二进制运算比较吃力,遂通过一篇博文来总结下二进制运算,记录一下. 读者认 ...

最新文章

  1. .NET获取主机名字、IP的两种方式(转载)
  2. 一分钟了解阿里云产品:对象存储OSS概述
  3. 关于用notepad++确认代码中\r\n\t空格等不显示的字符
  4. 网页实现人脸识别PHP,奇思妙想-用HTML5进行人脸识别
  5. 如何把Python脚本导出为exe程序
  6. 人生苦短,喝点python性能鸡汤
  7. 图网络笔记-知识补充与node2vec代码注解
  8. extjs简单分页grid的总结
  9. yum安装php解析,详解Centos下YUM安装PHP的两种方式
  10. java图书管理系统(MySQL)
  11. objective C 随机数
  12. MSF利用ms17_010实验
  13. 隐马尔科夫模型(二)
  14. python怎么编写口算题_用Python开发小学二年级口算自动出题程序
  15. Effective C++ 条款13 以对象管理资源
  16. 《数据安全法》实施一周年,企业和个人发生哪些转变?|上云那些事
  17. 解决微博SDK接入全平台支持
  18. CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
  19. python遇到错误跳过_python跳过错误
  20. (JAVA编程练习):输入某年某月某日,判断这一天是这一年的第几天?

热门文章

  1. javascript音乐播放器
  2. 孩子为什么不能玩抖音精彩回答,共勉
  3. 电脑系统下载,安全,纯净,原版,iso系统
  4. 循环链表之双循环链表
  5. 前端性能优化(图片优化)
  6. UTONMOS:元宇宙链游之风、燎原之势
  7. 重磅!这可能是史上最全的AI产业链地图了
  8. ‘海外/国外‘地区微博签到shu据(正题在第二部分)
  9. C++程序设计:相邻数对
  10. ASUS R556L华硕老笔记升级,换固态硬盘,鸟枪换炮记:买固态硬盘的纠结和艰辛的系统迁移(前后花了三天时间)