整数补码——如何定义相反数。

出现的原因

想要表示3+5,可以转化为8位2进制:0000 0011+0000 0101=0000 1001。

结合二进制加法,这是很容易的。那么减法该怎么办?

3-2=3+(-2),那么我们只要表示-2即可。为此,我们提出了反码来表示一个整数的相反数。

原理

以8位2进制为例:一个整数的储存只能转化为8位2进制,如果是9位的,那么第9位就溢出了。形象一些来讲:计算机的视野只能看到8位,多了一位进来就把第9位顶出去了,但是计算机只能看到8位,所以第9位它是看不到的。

利用这个特点,我们设计出了补码系统。设我们现在用的是X位2进制,也就是说:如果我们想要表达一个大于2^X的正整数,那么X位2进制是存不下这个数字的,转换为2进制后,这个数字将从右向左数X位存入,剩下的左边的数字就被裁掉了。

以8位2进制为例,例如:

其中

可以看到这是一种类似于“周期”的特性。以8位二进制为例,那么这个周期就是:

由于"周期"+"溢出",我们很自然的得到了一个"用周期溢出表示相反数"的方法.

即用周期来减一个数字,就可以得到它的负数。根据这个方法,我们就可以设计储存相反数了。

例子

先看一个例子:

假设我们使用8位2进制表示2的补码:

用这个8位2进制所能表达的最大整数+1,也就是周期来减。我们先写出这个周期为:

但是由于8位2进制只能有8位,我们这个周期有9位,无法运算,所以我们把它拆成两步:

所以我们先用第一部分

不难发现这一部分的运算有一个特点:给减数求反。这就是反码的由来。

再用得到的结果加上刚刚的1得:

右面的这个数就是2的补码:-2.

这就是“按位取反再加1”的由来。这样我们就可以进行减法操作了,即:

由于我们采用8位2进制,最左面一位1将会溢出,最后储存在这个8位2进制变量中的2进制数为:

这样一来,我们就可以表示减法了。

进一步地思考

回头看8位有符号整数的储存:最左边一位为0则表示非负数,最左边一位为1则表示负数。因此8位有符号整数可以表示的数字范围是:

其中

这与补码有什么关系呢?容易证明,只要我们定义右7位表示的数为非负数,通过取反码自然可以得到负数的8位2进制表示,最左侧位一定为0.这告诉我们:在支持反码的系统中,n位2进制只能表示:

其中

更进一步地:

假设系统支持补码,那么如果从小到大排列所有的位进制数那么前位一定是非负数后位一定是负数

这也解释了为什么两个正数相加可能会溢出得到负数——这运用到了补码的“溢出”原理。

原理的数学解释

事实上,如果引入数论中同余的概念,这一性质将会更容易被展现:

同余的线性运算性质

举例来说:

待补充……(似乎用数论的观点看待有点复杂化了)

参考资料

1.黄程程讲编程 Java016 深入理解二进制及整数补码

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

整数补码——如何定义相反数。相关推荐

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

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

  2. c语言相反数补码,C语言中补码的整数运算特性

    前言 本篇博客以"SSD6-Exercise2-Data Lab: Manipulating Bits"为例,分析在对C语言中的整数采用补码(two's-complement)编码 ...

  3. 网易2018校园招聘:相反数 [python]

    ''' [编程题] 相反数 时间限制:1秒 空间限制:32768K 为了得到一个数的"相反数",我们将这个数的数字顺序颠倒,然后再加上原先的数得到"相反数". ...

  4. 求一个数的相反数的补码

    1.已知8位二进制表示的整数X的补码为10011011,则-X的补码的二进 制编码为( 01100101 ). 解析:已知x和-x的反码是互为相反的,所以已知x的补码,[x]反 = [x]补  - 1 ...

  5. 找到一个或多个多重定义的符号_初中数学之相反数,总结规律,学会多重符号的化简...

    今天继续和大家一起来学习初中数学,初一的相关知识,在前面已经介绍了正数和负数,对于有理数也有了清楚的认识,今天我们来学习相反数,相反数的概念和表示是中考命题的热点之一,经常结合其他知识点一起考察,本节 ...

  6. 位运算获取相反数详解

    位运算有很多化腐朽为神奇的操作,取相反数就位列其中,我们总是用[取反+1]来求相反数,就如同公式一样使用,可否曾仔细琢磨过其中的原理呢? 为什么[取反+1]是相反数? 在数学中,互为相反数的两数相加为 ...

  7. 取反(~)和相反数 是不一样的!!!

    这几天正在看补码的问题,发现这个东西实在是太神奇了, 在计算机存储的都是按照补码的方式,这样的方式可以进行计算,但是除了补码还有原码和反码 他们虽然都可以表示数字,但是原码和反码不能进行计算,就是不符 ...

  8. 首师大附中OJ系统 0007 相反数的问题

    相反数的问题 这里可以快速跳转 试题要求 试题分析 试题代码 试题要求 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 小雅刚学 ...

  9. ACMNO.31 C语言-宏求余 输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。

    题目描述 输入两个整数,求他们相除的余数.用带参的宏来实现,编程序. 输入 a b两个数 输出 a/b的余数 样例输入 3 2 样例输出 1 来源/分类 C语言 题目截图: 思路: 这个是求余数,应该 ...

最新文章

  1. day16-小数据池
  2. 【剑指Offer】16重建二叉树
  3. 易宝典文章——用ISA 2006标准版发布Exchange 2010的OWA系列之外网客户端
  4. k8s通过label来控制pod的位置
  5. python 单一继承定义_Python学习之单继承与多继承
  6. 阿里的爱心助农“生意”:严把质量关 一场多业务线的联动大练兵
  7. 如何在内存中存储有序数据?
  8. Hspice 反相器仿真
  9. 马云创业过程中的10次失败(转)
  10. Internet结构和ISP
  11. 【C++OJ多重继承与虚拟继承】商旅信用卡(多重继承)
  12. Windows蓝屏死机骗局:新的恶意钓鱼方式
  13. 【MOS管电平转换电路的一点思考】
  14. 一眼就吸引人的网名「引人注目」
  15. 基于Domoticz智能家居系统(十四)用ESP8266做MQTT客户端实验
  16. 最全的 JVM 面试知识点(二):垃圾收集
  17. 业务规范之springboot整合swagger2
  18. 家庭光纤宽带延长光纤
  19. WPA3也不安全啦?WPA3-R3 H2E了解一下
  20. 手把手教你用Python轻松玩转SQL注入

热门文章

  1. 荣耀畅玩9a有机会申请鸿蒙系统吗,关于荣耀畅玩9A你不知道了一面,我想分享一下...
  2. html5 dreamlive,TME live追梦之夜线上演唱会,Dream Team为梦想而战
  3. 20.JDBC操作数据库
  4. 麦芒装饰小程序配置问题处理
  5. c++继承 子类构造函数出现报错no matching function for call to ‘xxx::xxx()
  6. python虚拟环境venv、virtualenv
  7. 运用css和Html动画实现会动的摩天轮
  8. Lesson 5 No wrong numbers 无错号之虞
  9. 一天300个快递,康小康团队都撸些什么商品回来?
  10. 我有一个梦想(马丁·路德·金在林肯纪念堂前的演讲词)