原码,反码,补码详解及原理

  • 原码

 原码:在数值前直接加一符号位的表示法。
例如: 符号位 数值位
byte的取值范围
[+7]原= 0 0000111 B[-7]原= 1 0000111 B
注意:
byte的取值范围是-27~ 27-1 总计256个数
即:
无符号位 0~255 (因为计算机是从0开始计算的而不是1)
有符号位 -128 ~ +127

  • 反码

浮点表示方法

反码:正数:正数的反码与原码相同。负数:负数的反码,符号位为“1”,数值部分按位取反。例如: 符号位 数值位
[+7]反= 0 0000111 B
[-7]反= 1 1111000 B
注意:1000 0000 B 不等于0 而是 -128
+127 +1 = -128
即 0111 1111 B+1 = 1000 0000 B
也就是发生了 byte值溢出
8位二进制反码的表示范围:-127~+127
为什么 -128 的二进制会是1000 0000;
1000 0000 (原) = 1111 1111(反)
那么问题来了: 64+32+16+8+4+2+1 = 127 为什么会有128呢?
原来 负数的反码是需要补码来计算的,也就是在最后得出的结果上 +1
注意:计算机中只有 +0 而不存在 -0的说法,因为-0是完全没有意义的存在,
即:只有 0000 0000 = +0
而没有 1000 0000 = -0
1000 0000的真实身份是 -128

(3)补码的表示方法
1)模的概念:把一个计量单位称之为模或模数。例如,时钟是以12进制进行计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射为+2。由此可见,对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。10和2对模12而言互为补数。
同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为2^8=256。在计算中,两个互补的数称为“补码”。

2)补码的表示:
正数:正数的补码和原码相同。
负数:负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。
例如: 符号位 数值位
[+7]补= 0 0000111 B
[-7]补= 1 1111001 B
补码在微型机中是一种重要的编码形式,请注意:
a. 采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化。正数的补码即是它所表示的数的真值,而负数的补码的数值部分却不是它所表示的数的真值。采用补码进行运算,所得结果仍为补码。
b. 与原码、反码不同,数值0的补码只有一个,即 [0]补=00000000B。
c. 若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围。

转换

由于正数的原码、补码、反码表示方法均相同,不需转换。
在此,仅以负数情况分析。
(1) 已知原码,求补码。
例:已知某数X的原码为10110100B,试求X的补码和反码。
解:由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。
1 0 1 1 0 1 0 0 原码
1 1 0 0 1 0 1 1 反码,符号位不变,数值位取反
1 +1
1 1 0 0 1 1 00 补码
故:[X]补=11001100B,[X]反=11001011B。
(2) 已知补码,求原码。
分析:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1 有方法。
例:已知某数X的补码11101110B,试求其原码。
解:由[X]补=11101110B知,X为负数。
采用逆推法
1 1 1 0 1 1 1 0 补码
1 1 1 0 1 1 0 1 反码(末位减1)
1 0 0 1 0 0 1 0 原码(符号位不变,数值位取反)

示例:
请大家来做两个题目:有符号数运算时的溢出问题
两正数相加怎么变成了负数???

1)(+72)+(+98)=?
0 1 0 0 1 0 0 0 B +72
0 1 1 0 0 0 1 0 B +98
1 0 1 0 1 0 1 0 B -86
两负数相加怎么会得出正数???
2)(-83)+(-80)=?
1 0 1 0 1 1 0 1 B -83
1 0 1 1 0 0 0 0 B -80
0 1 0 1 1 1 0 1 B +93
思考:这两个题目,按照正常的法则来运算,但结果显然不正确,这是怎么回事呢?
答案:这是因为发生了溢出。

  如果计算机的字长为n位,n位二进制数的最高位为符号位,其余n-1位为数值位,采用补码表示法时,可表示的数X的范围是 -2的n-1次幂≤X≤2的n-1次幂-1
当n=8时,可表示的有符号数的范围为-128~+127。两个有符号数进行加法运算时,如果运算结果超出可表示的有符号数的范围时,就会发生溢出,使计算结果出错。很显然,溢出只能出现在两个同符号数相加或两个异符号数相减的情况下。
对于加法运算,如果次高位(数值部分最高位)形成进位加入最高位,而最高位(符号位)相加(包括次高位的进位)却没有进位输出时,或者反过来,次高位没有进位加入最高位,但最高位却有进位输出时,都将发生溢出。因为这两种情况是:两个正数相加,结果超出了范围,形式上变成了负数;两负数相加,结果超出了范围,形式上变成了正数。
而对于减法运算,当次高位不需从最高位借位,但最高位却需借位(正数减负数,差超出范围),或者反过来,次高位需从最高位借位,但最高位不需借位(负数减正数,差超出范围),也会出现溢出。
  在计算机中,数据是以补码的形式存储的,所以补码在C语言的教学中有比较重要的地位,而讲解补码必须涉及到原码、反码。
在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负;其余n-1位为数值位,各位的值可为零或一。当真值为正时,原码、反码、补码数值位完全相同;当真值为负时,原码的数值位保持原样,反码的数值位是原码数值位的各位取反,补码则是反码的最低位加一。注意符号位不变。

原码,反码,补码详解及原理相关推荐

  1. 原码, 反码, 补码 详解(转载)

    原码, 反码, 补码 详解(转载) 繁星*墨菲 于 2020-05-23 10:22:53 发布1015 收藏 75 版权 转载地址:原码, 反码, 补码 详解 - ziqiu.zhang - 博客园 ...

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

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

  3. 原码 反码 补码 详解

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

  4. 原码 反码 补码 详解

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

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

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

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

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

  7. 二进制原码反码补码详解

    二进制原码反码补码 首先我们在了解什么是原码,反码,补码之前,我们先来谈谈为什么需要有这些,只要原码不行吗? 答案肯定是不行的!

  8. 源码 反码 补码详解(为什么计算机存储数值为补码形式?)

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

  9. 嵌入式系统学习整理-FourDay-原码反码补码详解

    目录 一.前言 一.原码.反码.补码定义 1. 原码 2. 反码 3. 补码 二.补码的加减计算 一.前言 首先,要知道计算机底层都以二进制表示,数字也不例外,那么,如果数字加减运算的话,要怎么算呢? ...

  10. Java修炼之凡界篇 筑基期 第02卷 语法 番外1 原码 反码 补码

    原码 反码 补码 博客整理自 原码, 反码, 补码 详解 - ziqiu.zhang - 博客园 (cnblogs.com) 机器数与真值 在学习原码.反码和补码之前,需要先了解什么是机器数,什么是真 ...

最新文章

  1. 那些你所不知道的arXiv使用技巧
  2. mysql 单例模式好处_PHP单例模式的优点分析
  3. swift 简单语句 控制流语句
  4. 深度探秘.NET 5.0
  5. 在华为推送平台给手机推送步骤
  6. openwrt添加自己的iptables的targe编译报错
  7. arcgis for flex 学习笔记(一)
  8. Java:jdk8中map新增的merge方法
  9. 组装电脑配件选择教程
  10. 中兴配置dhcp服务器,中兴F623路由器如何投入使用dhcp服务器
  11. php随机生成昵称,PHP随机生成姓名的方法介绍
  12. Zotero英文翻译插件安装教程
  13. 阵列卡服务器装linux,Linux网卡阵列卡安装
  14. 结合百度搜索引擎SEO优化指南揭密百度SEO建议
  15. js判断鼠标单击或者双击事件
  16. workbench与SolidWorks联合划分六面体网格
  17. 微软与三维图形:抑制竞争和创新的案例研究
  18. org.apache.jasper.el.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl
  19. npm ERR! code E404 npm ERR! 404 no such package available : xxx
  20. 【学习笔记】超实数(Surreal Number)和不平等博弈

热门文章

  1. 推荐一个好用的 所见即所得的 markdown 编辑器 Mark Text
  2. 如何做好大数据监测和舆情案例分析工作的办法
  3. 【FreeRTOS】软件定时器的使用
  4. 详解JSP 中Spring工作原理及其作用
  5. jdk9安装及java环境配置
  6. cin、cout、cerr、clog用法区别及其在VS环境下的重定向
  7. IOS系统历届版本大回顾(iOS7)
  8. 推荐几款好用的UI框架 和 后台管理系统(开源免费)
  9. 织梦官方幻灯片调用以及幻灯片模糊的处理办法
  10. centos7 SSH服务启动时报“main process exited, code=exited”status 255错误