原码反码补码原理理解

  • 基础知识
  • 原码
    • 定义
    • 在这里,我们模仿一下计算机对数据运算的过程!
    • 那么所有运算都是正确的吗?我们再试一组。
  • 反码
    • 定义
    • 在这里,我们模仿一下计算机对数据运算的过程!
    • 正数加负数也没问题了,那负数加负数会出错吗?我们来试一下!
  • 补码
    • 前言
    • 定义
    • 在这里,我们模仿一下计算机对数据运算的过程!
  • 原码反码补码的本质
    • 原码:
    • 反码和补码:

基础知识

说原码反码补码,我不想说他们的定义或者是算法。我只想请诸君随我一同解决一道题。
7 - 3 = ?(均为十进制)
这道题的答案相信各位能脱口而出,但是把这道题放到计算机中,计算机可就犯难了,首先我们计算机需要运算的是二进制数据,其次我们计算机中的运算位却只有加法运算器却没有减法计算器。那我们怎么完成数字的减法呢?

很简单,加上一个减数的相反数就行了。

可是减数(一定是正数)的相反数一定是负数,而负数前面的符号怎么解决呢?这就不得不引入符号位了。

其实原码反码补码本质上就是为了解决计算机在作减法时和引入的符号位之间的问题!

原码

定义

原码就是将一个数转换为二进制,第一位(即最高位)表示这个数的符号,1位负号,0为正号

例如(以带符号位的四位二进制数为例)

3 的原码是0011(其中0代表3是个整数,011代表3的二进制表示)
-3 的原码是1011(其中1代表-3是个负数,011代表3的二进制表示)

在这里,我们模仿一下计算机对数据运算的过程!

1.我们将3和4输入到计算机中进行加法运算,这里我们期望得到的数值为7
2.计算机将3和4分别转换为原码,3变成0011,4变成0100
3.计算机将3和4的原码相加,此时我们运用小学时便学过的方法按位相加

4.此时得到的结果与我们预期相吻合!

那么所有运算都是正确的吗?我们再试一组。

1.我们再将3和-3输入到计算机中进行加法运算,这里我们得到的期望数值为0
2.计算机将3和-3分别转换为原码,3变成0011,-3变成1011
3.计算机将3和-3的原码相加

4.此时计算机将会得到一个我们意想不到的答案!怎么可能3 + ( - 3 ) = - 6?

别慌,科学家们也意识到这个问题(即正数之间的加法不会出错,而正数和负数相加便会引起莫名其妙的结果),可这个问题该怎么解决呢?
于是便引入了反码!!!

反码

定义

我们知道,正数与正数的原码进行运算是没有问题的,可正数的和其相反数的原码相加便会出错。

例如:0011 + 1011 == 1111 (3 + - 3 = - 7)

所以反码便是为了解决这点(即将正数的相反数的原码与正数的原码相加不等于0)

反码:正数的反码还是原码,负数的反码是原码除了符号位以外,其余位数按位取反

在这里,我们模仿一下计算机对数据运算的过程!

1.我们再将3和-3输入到计算机中进行加法运算,这里我们得到的期望数值为0
2.计算机将3转换为反码,即3变成0011,然后由于-3是负数,计算机将-3的原码按位取反,即-3变成1100
3.计算机将3和-3的反码相加,得到1111(注意此时两个数的反码相加我们得到的也是一个数反码,并且这个数是个负数,我们需要在此将这个负数的反码转换为原码,即把1111除符号位以外按位取反,变成1000,即-0)
4.- 0 = 0,所以我们得到的结果符合我们的预期

我们再尝试一组

1.我们再将3和-5输入到计算机中进行加法运算,这里我们得到的期望数值为-2
2.计算机将3转换为反码,即3变成0011,然后由于-5是负数,计算机将-5的原码按位取反,即-5变成1010
3.计算机将3和-5的反码相加,得到1101(取反转换为原码后为1010即-2)
4.- 2 = - 2,所以我们得到的结果符合我们的预期

正数加负数也没问题了,那负数加负数会出错吗?我们来试一下!

1.我们再将-2和-3输入到计算机中进行加法运算,这里我们得到的期望数值为-5
2.计算机将-2的原码按位取反,即-2变成1101,然后计算机将-3的原码按位取反,即-3变成1100
3.计算机将-2和-3的反码相加,得到1001(取反转换为原码后为1110即-6)
4.- 6 不等于 - 5,所以计算机又出错了!

那么怎么解决呢,其实很简单,负数加负数其实就等于两者的正数相加,然后符号位强制为负号。

也就是说,(- 2 ) + (- 3)= (-)(2 + 3)= - 5

既然2+3不会出错,那么(-)(2 + 3)就不会出错,那么(- 2 )+(- 3 )也就不会出错了。

其实反码已经解决了减法的问题,而且加法的运算原码也能完成。既然如此,那我们课程中学习的补码又有什么用呢?
其实补码才是最难理解的,下面听我细说。

补码

前言

说补码,我不想先说补码的定义或者是算法。还是这道题
7 - 3 = ?(均为十进制)
对于计算机来说,除了计算相反数就没有别的办法了吗?
有的,不知道各位有没有留意到我们最常见的时钟,我们将这道问题转换为一个时钟。
就像我们日常生活中解决减法问题一样

理解了这个再来理解补码就容易得多了。

定义

补码:正数的补码等于它的原码,负数的补码等于反码加一

其实书上也就这句话告诉我们补码怎么计算。我们也不知道为什么负数的补码等于反码加一。而且科学家也不可能随随便便将反码加一定义为补码。只不过补码就正好等于反码加一。接下来我来细致的讲讲负数的补码为什么等于反码加一。

在这里,我们模仿一下计算机对数据运算的过程!


这是计算机根据这种思想完成的运算。

如果根据补码计算

接下来我们根据教材上教给我们的办法完成
对-3的补码运算:
-3的原码为 1011
-3的反码为 1100
-3的补码为 1101

与我们再上上一张图片中计算得到的0101只有符号位有差别。但我在上上一张图中得到的是一个正数(与-3同余的正数)而我们只需要更改一下符号位便可以得到-3的补码。
接下来我将通过几组数据来验证一下我的猜想:

原码反码补码的本质

原码:

原码便于解决两个正数或者两个负数相加的问题,类似于计算机中的加法运算器。

反码和补码:

反码和补码都便于解决正数和正数相减的问题,但两者解决的方式不同。

以正数A减去正数B等于C为例(均为十进制)

反码解决方式:
1.首先将减法问题转换为加法问题。
A - B = A + (- B)其中 -B 为B的相反数
2.然后将A的反码加上-B的反码此时得到C的反码
3.将C的反码转换为原码得到C

补码解决方式:
1.首先将减法问题转换为加法问题
2.计算机找到一个整数与B同余
3.将计算结果取模

原码反码补码原理理解相关推荐

  1. 补码原码转换c语言代码,c/c++原码反码补码原理 以及进制转换

    1首先了解 低字节位 和高字节位 看图 2字节在内存的排列方式//int num = 010; //0开头代表 8禁止 //("%d",num); //所以打印的是8 int nu ...

  2. 机器数.原码 反码 补码比较理解

    计算机中的数据实际上是一串二进制串,仅包含数字0和数字1.人们对于数字的直观理解来源其十进制数,对于为人们所熟悉的十进制的数来说,其加减乘除运算规则十分简洁且易于计算,正负数之间的运算法则也有其特定的 ...

  3. java基础-原码反码补码

    本文帮助理解,Java中原码反码补码的原理 1:原码反码补码,基础概念和计算方法 对于一个数,计算机需要使用一定的编码方式进行存储.原码反码补码是计算机存储一个具体数字的编码方式. 原码: 第一位表示 ...

  4. 关于计算机中 原码, 反码, 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  5. 原码, 反码, 补码, 移码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  6. 原码 反码 补码 详解

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...

  7. 原码 反码 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  8. 原码, 反码, 补码详解——北大陈向群老师课堂笔记

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符 ...

  9. 原码, 反码, 补码 详解

    本文转载于: 作者:张子秋 出处:http://www.cnblogs.com/zhangziqiu/ 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进 ...

最新文章

  1. 点击通知栏后打开Activity,并传参
  2. Java 8 中 HashMap 到底有啥不同?
  3. html的分类与特点
  4. sscanf fscanf函数格式化输入遇到\n问题
  5. IOS TextField设置大全
  6. PHP点击跳转QQ,thinkphp3.2 获取QQconnect Login 跳转到的地址值
  7. LeetCode 832. 翻转图像(异或^)
  8. 想多了!亚马逊中国没有离开 | 畅言
  9. 聊聊kafka consumer offset lag的监控
  10. Java数据类型转换
  11. 51单片机中外部中断使用示例(Protues仿真)
  12. 【视频】CCNA——小凡模拟器的简单介绍和使用
  13. 利用Python使图片完美去除水印,我想试试马赛克的效果∧v∧
  14. 我写了款依赖检查的插件
  15. DOM控制video实现开始/暂停按钮思路方法
  16. 扒一扒有限元的那些书
  17. 如何轻松入门西门子 SCL(结构化控制语言) | 附官方教程下载
  18. 找到一个电信代理服务器~
  19. matlab向excel连续写数据,每次换行
  20. meta20 无法安装 google play_【黑科技】安卓手机安装Google Play

热门文章

  1. Oracle 无效的列索引
  2. 微信小程序怎么调用本机地图APP ?
  3. linux-I/O模式
  4. 16G+512G固态,2021新款笔记本电脑吃鸡贼爽!包邮送一个!
  5. 电脑水冷,电脑水冷好还是风冷好 电脑水冷和风冷区别【图文】
  6. C语言幸运星课程设计,涉及约瑟夫环算法,多个版本
  7. [Git]使用命令行更改用户名和邮箱
  8. ModelMap的用法
  9. 浑身无力酸痛是植物神经紊乱了吗?
  10. ObjectARX中矩阵AcGeMatrix3d的使用介绍