数据在计算机中的存储并非我们在物理世界见到的那样,由于计算机只能存储二进制数,因此需要将十进制数转换成二进制数再进行存储,而转换后的二进制数的运算也面临许多问题,因此引入了反码和补码的概念!

在微机中,凡是有符号数都是采用补码表示,所以运算的结果也是用补码表示的。

为什么引入补码的概念呢?

因为在计算机中,对于二进制的算术运算可以将乘法运算转换为加法和左移运算,而除法则可转换为减法和右移运算,故加、减、乘、除运算最终可归结为加、减和位移 3种 操作来完成。

但在计算机中为了节省设备,一般只设置加法器而无减法器,这就需要将减法运算转化为加法运算,从而使计算器中的二进制四则运算最终变成加法和位移两种操作。

引入补码运算就是用来解决将减法运算转化为加法运算的。

数据的表示:基数 & 权

无论哪一种进制数的表示,都是由 基数和权的组合,

计算机中的符号数有3种表示方法,即 源码、反码、补码,它们均是由符号位和数值部分组成;

  • 符号位的表示方法相同:即 1表示负数,0表示 正数

1、原码

[X]原={X0≤X2n−1−X=2n−1+∣X∣X≤0\qquad \qquad [X]_原 = \begin{cases} X \qquad \qquad\qquad\qquad\qquad \quad 0 \leq X \\ 2^{n-1} - X =2^{n-1} + |X| \qquad X \leq0 \end{cases}[X]原​={X0≤X2n−1−X=2n−1+∣X∣X≤0​

  • 机器数的最高位为符号位:0表示正号,1表示负号,其他部分是数的绝对值;

  • 源码表示中的 0 有两种不同的表示形式,即 +0 和 -0;
    [+0]原=00000000[+0]_原 = 0000\quad 0000[+0]原​=00000000
    [−0]原=10000000[-0]_原 = 1000\quad 0000[−0]原​=10000000

  • 原码表示法的优点是:简单、易于理解,与真值间的转换较为方便,用原码实现乘除运算的规则比较简单;

  • 原码表示法的优点是:进行加减运算时比较麻烦,要比较加减运算的两个数的符号、两个数的绝对值的大小,还要确定运算结果的正确的符号等;

2、反码

真值 X 的反码记为 [X]反[X]_反[X]反​ 。

[X]原={X0≤XX+{2n−1}X≤0\qquad \qquad [X]_原 = \begin{cases} X \qquad \qquad\qquad \quad 0 \leq X \\ X+ \{ 2^{n} -1 \} \qquad X \leq0 \end{cases}[X]原​={X0≤XX+{2n−1}X≤0​

  • 对于正数而言,其表示方法同原码一样,即数值部分与真值相同;
  • 对于负数而言,其反码的数值部分为真值的各位按位取反;

反码的性质:

  • 在反码表示法中,机器数的最高位是符号位,0表示正数,1表示负号;

  • 反码运算很不方便,数值 0 的表示也不唯一,因此在处理器中很少使用;

  • 同原码一样,数0 也有两种表示形式;
    [+0]反=00000000[+0]_反 = 0000\quad 0000[+0]反​=00000000
    [−0]反=11111111[-0]_反 = 1111\quad 1111[−0]反​=11111111

3、补码

真值 X 的补码记为 [X]补[X]_补[X]补​ 。

[X]补={X0≤X2n−∣X∣X≤0\qquad \qquad [X]_补 = \begin{cases} X \qquad \qquad\qquad \quad 0 \leq X \\ 2^{n} - |X| \qquad \qquad X \leq0 \qquad\end{cases}[X]补​={X0≤X2n−∣X∣X≤0​

  • 与原码和反码的表示法相同,机器数的最高位是符号位,0表示正号,1表示负号;

  • 正数的补码与它的原码相同;而反码的补码等于其符号位不变,数值部分的各位按位取反 再加1;

  • 数 0 的补码表示法是唯一的;
    [+0]补=00000000[+0]_补 = 0000\quad 0000[+0]补​=00000000
    [−0]补=[−0]反+1=11111111+1=00000000[-0]_补 = [-0]_反 +1 =1111\quad 1111 +1 = 0000 \quad 0000[−0]补​=[−0]反​+1=11111111+1=00000000
    SO [+0]补=[−0]补=00000000\qquad[+0]_补 = [-0]_补 = 0000 \quad 0000[+0]补​=[−0]补​=00000000

  • 对于8进制数而言,其取值范围是 -128 —+127;

4、补码的运算

  • 补码的加法规则:[X+Y]补=[X]补+[Y]补[X+Y]_补 = [X]_补 + [Y]_补[X+Y]补​=[X]补​+[Y]补​
  • 补码的减法规则:[X−Y]补=[X]补−[Y]补=[X]补+[−Y]补[X-Y]_补 = [X]_补 - [Y]_补 = [X]_补 + [-Y]_补[X−Y]补​=[X]补​−[Y]补​=[X]补​+[−Y]补​

注:
[−Y]补[-Y]_补[−Y]补​ 称为对补码数 [Y]补[Y]_补[Y]补​ 求变补;

变补的规则为:

  • 对 [Y]补[Y]_补[Y]补​ 的每一位(包括符号位)按位取反加 1,则结果就是 [−Y]补[-Y]_补[−Y]补​。
  • 当然,也可以直接对 −Y-Y−Y 求补码,结果是一样的。

有符号数运算时的溢出判断

咋两个有符号数进行加减运算时,如果运算结果超出上述可表示的有效范围,就会发生溢出,使计算结果出错。

判断有符号数相加或异符号数相减时:

  • 如果次高位向最高位有进位(借位),而最高位向上无进位(借位),则结果发生溢出;
  • 反过来,如果次高位向最高位无进位(借位),而最高位向上有进位(借位),则结果也发生溢出;

对于 8位 二进制数,若 D6D_6D6​ 位产生的 进位(借位)记为 C6C_6C6​,D7D_7D7​ 位产生的进位(借位)记为 C7C_7C7​,那么:

  • 在两个带符号二进制数相加或相减时,若 C6⊕C7C_6 \oplus C_7C6​⊕C7​ 则结果产生溢出(⊕\oplus⊕ 是异或);
    无符号数 与 有符号数产生溢出的条件因各自可表示数的范围不同而不同。
  • 无符号数的溢出判断仅看最高位向上是否有进位(借位);
  • 有符号数的溢出判断需要看次高位和最高位 两位的进位(借位)情况;
    两位都产生进位(借位)或都没有产生进位(借位),则结果无溢出;
    其中只有一位产生了进位(借位),则结果产生溢出,计算结果不正确;

运算时产生溢出,其结果肯定不正确,计算机对溢出的处理,一般是产生一个中断,通知用户采取某种措施;

详解计算机运算 之 补码相关推荐

  1. 有符号数和无符号数详解(2)补码详解

    有符号数和无符号数详解(2)补码详解 1. 为什么需要补码 1.1 背景 2 补码的思想 2.1 我们希望只设计加法运算器,不用减法运算器. 2.2 现在问题是:怎么表示-1呢? 3. 补码 3.1 ...

  2. 详解计算机内部存储数据的形式 二进制数

    详解计算机内部存储数据的形式-二进制数 前言 要想对程序的运行机制形成一个大致印象,就要了解信息(数据)在计算机内部是以怎样的形式来表现的,又是以怎样的方法进行运算的.在 C 和 Java 等高级语言 ...

  3. 详解计算机内存及基于内存理解的几种数据结构

    详解计算机内存 前言 计算机是进行数据处理的设备,而程序表示的就是处理顺序和数据结构..由于处理对象数据是存储在内存和磁盘上的,因此程序必须能自由地使用内存和磁盘.本文详解内存的物理结构,逻辑结构以及 ...

  4. 计算机图形学算法详解,计算机图形学裁剪算法详解

    <计算机图形学裁剪算法详解>由会员分享,可在线阅读,更多相关<计算机图形学裁剪算法详解(10页珍藏版)>请在人人文库网上搜索. 1.裁剪算法详解在使用计算机处理图形信息时,计算 ...

  5. 计算机基础知识及其详解,计算机基础知识详解:计算机入门基础知识

    能力训练网权威发布计算机基础知识详解,更多计算机基础知识详解相关信息请访问少儿综合素质训练网. [导语]以下是大范文网整理的计算机基础知识详解,欢迎阅读! 1.第一台计算机-ENIAC 大家只要知道第 ...

  6. 计算机二级字处理题考点详解,计算机二级操作题.doc

    2.3字处理题考点详解 一.设置文本格式 设置字体:开始-字体-下拉列表中选择字体 设置字号:开始-字体-下拉列表中选择字号 加粗(Ctrl+B):开始-字体-单击"加粗"按纽 倾 ...

  7. C语言,详解二进制位运算

    本文章主要讲解整数的位运算,供大家参考 文章目录 前言 一.位运算 二.取反 三.运算 四.函数操作 1.两数交换 2.改变符号 3.取绝对值 4.判断奇偶性 5.求模 6.两数相加 五.总结 前言 ...

  8. 15从零开始学Java之详解计算机中的进制转换

    作者:孙玉昌,昵称[一一哥],另外[壹壹哥]也是我哦 CSDN博客专家.万粉博主.阿里云专家博主.掘金优质作者 配套项目资料 https://github.com/SunLtd/LearnJava h ...

  9. 计算机组成原理题库带答案详解,计算机组成原理试试题库(含答案解析) -.doc

    Word文档下载可编辑 专业技术资料 计算机组成原理试题 一.单项选择题(从下列各题四个备选答案中选出一个正确答案,并将其代号写在题干前面的括号内.) 1.为了缩短指令中某个地址段的位数,有效的方法是 ...

最新文章

  1. 到「黄埔学院」去:打造AI首席架构师,第二期限量招募!
  2. 【讲师团招募令】14场线上万人社区大会 邀你来分享
  3. Python介绍以及Python 优缺点
  4. Asp.net Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 (多级路由) 如:Admin/Test/Index...
  5. 【LaTeX】E喵的LaTeX新手入门教程(4)图表
  6. 安装pycrypto 2.6.1各种坑
  7. python3.6和2.7的区别_Python2.7与3.6的一些区别
  8. LeetCode(118)——杨辉三角(JavaScript)
  9. 华为三星折叠手机可看不可摸;小米架构再调整;杨幂 AI 换脸视频制作者回应 | 极客头条...
  10. Akka适用于分布式系统《five》译
  11. 【机器学习】hist参数解读
  12. php cgi启动报错,php编译安装,cgi启动,以及memcache扩展编译安装.
  13. Dagger2 学习
  14. 全局变量、函数原型和Guard macro
  15. LeetCode 915. 分割数组**(double,需要trp)
  16. ubuntu壁纸1080p
  17. Life feelings--10--inspiration and inner motivation
  18. 抗生素耐药性革兰氏阴性菌感染的治疗,2020最新IDSA指南
  19. gzip和deflate的区别
  20. 程序员遭遇:一觉睡来7个未接电话,到公司时已被踢出群

热门文章

  1. 运动蓝牙耳机哪个品牌好,推荐六款运动跑步耳机
  2. Mysql查看数据库时区并设置时区
  3. leetcode(6.Z字形转换)【中等】
  4. 安卓手机卡顿怎么解决_当你的手机卡了,内存不能乱清理!试试这3个方法,有效解决手机卡顿...
  5. Linux下 su命令与su - 命令有什么区别?
  6. 【区块链】Tendermint——概述、PoS共识算法与架构
  7. IPv6 内网穿透(二)
  8. 王者非法进入服务器维护封号,王者荣耀2018最新封号规则:最高可封号365天
  9. 信息学奥赛一本通 1341:【例题】一笔画问题
  10. 链表的10个题目——第2周打卡