负数为什么要用补码来表示?

2023-11-11

上篇文章讲了“负数在计算机中是怎么存储的”。看完之后,应该对原码,反码,补码有了基本的了解了。

今天,我们深入探讨一下,为什么计算机中要用补码来表示负数?

首先,我们应该清楚,原码是方便给人看的。看到一个数的原码,我们就能根据符号位和后边的二进制位,计算出这个数的实际值。为了简单起见,我以一个字节8位来举例,如

// 1 的原码 ,最高位0代表正数
0000 0001
// -1 的原码, 最高位1代表负数
1000 0001

可以看到,1和 -1 的原码只有符号位不同。然后,思考一个问题,1 - 1 = ?

是的,我们可以直接通过减法去计算,得出1-1=0 。但是,做减法运算时,可能会遇到不够减而需要借位的情况,这显然是比较麻烦的。我们换一种思路。 1-1 在数学中等同于 1 (-1)。这样,把减法转换为加法就简单的多了,只需要考虑进位就可以了。(其实,计算机中只有加法器,没有减法器,因此减法是通过加法器来计算的。)

于是,我们看下,把1和-1的原码相加等于多少(需要让符号位也参与运算)

  0000 0001
  1000 0001
  1000 0010

结果是 -2 ,这显然不符合我们的预期。

为了解决原码减法的问题,于是,出现了反码。使用反码,再来计算一下。

// 1的反码,同原码
0000 0001
// -1的反码,符号位不变,其他取反
1111 1110

相加之后,得 1111 1111 ,这是反码,转为原码为 1000 0000 ,即为 -0 。

但是,这又有问题了,在数学中0就是0,怎么到这还有 -0, 0之分。按照原码的概念来算, 0的原码为0000 0000 , -0 的原码为 1000 0000 。问题就出在这了,如果遇到0的计算,是应该用 0 还是用 -0 计算呢,这就会产生分歧。于是,补码出现了,解决了0的符号问题 。

// 1的补码,同原码
0000 0001
// -1的补码,反码  1
1111 1111

相加得 1 0000 0000 ,最高位进位之后,超过了8位,于是舍去,即为0000 0000。此为补码,转为原码也是0000 0000 ,这不就是0 吗。

这样一来,用补码0000 0000来表示0,就解决了 0和-0在原码上的分歧,统一了0的二进制表示方法。

那,又有疑问了,-0跑哪去了呢? 其实,-0即1000 0000在这用来表示 -128。但是,注意表示的是 -128的补码,因此 -128没有原码和反码。

那为什么用 1000 0000表示 -128呢 ?

先看下 -127 的原码、反码和补码:原码: 1111 1111反码: 1000 0000补码: 1000 0001

我们知道数学中 -127 -1 = -128 ,所以 -127的补码 -1 也应该等于 -128的补码,即1000 0001 -1 = 1000 0000。因此1000 0000就是 -128的补码。

在一个字节8位中,如果用原码来表示值的大小范围,只能是 1111 1111 ~ 0111 1111,即-127~127 。但是,如果用补码就可以表示 -128~127,正好是2^8,256个数。

因此,-0可以表示一个最低数。在8位二进制中它是1000 0000 ,在32位中,它就是 1000 0000 0000 0000 0000 0000 0000 0000 ,int的最小值。(32位数值大小范围为 -2^31 ~ 2^31 -1)

总结:补码的存在解决了0的符号问题,同时统一了计算机的加减法运算。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

负数为什么要用补码来表示? 的相关文章

  • Cookie 和 Session 归纳

    首先介绍下基本概念 cookie是服务器通知客户端让其保存健值对的一种形式 客户端有了cookie之后 每次请求就会发送给服务器 每个cookie最大是4kb 服务器创建cookie 1Cookie cookie new Cookie 创建
  • 【计算机基础】面试常问之进程、线程和协程

    文章目录 背景 为什么会有进程 线程和协程 1 进程的出现 2 线程的出现 3 协程的出现 1 进程 Process 1 1 什么是进程 程序与进程的区别 特点 1 2 进程通信及使用场景 无名管道 pipe 命名管道 FIFO 消息队列
  • 【ECS】阿里云ECS安装配置各种环境

    目录 ECS云服务器新手上路 快速配置Linux云服务器 远程连接VNC 配置Apache服务 解析网站域名 快速搭建LNMP环境 Linux Nginx MySQL PHP 安装并配置MySQL 5 7 41 数据库优化案例 安装Ngin
  • 一张图看懂数据结构-——图

    最小生成树 Prim算法 图解 一些说明 min weight数组表示该集合到达剩余顶点的最小值 adjvex表示这个最小权值是由哪个顶点引入 每次选取最小的权值顶点加入后 需要更新min weight的数值 选取值变为0 全部都为0时表示
  • 静默执行bat文件

    让bat隐藏运行需要用vbs文件才能实现 方式一 使用vbs文件 新建一个 文本文档后缀改为 vbs 可以这样写 set ws WScript CreateObject WScript Shell ws Run d yy bat 0 其中d
  • 【数据结构】记录

    栈 堆 树 前序遍历 中序遍历 二叉树 搜索二叉树 二叉查找树 二叉查找树 BST Binary Search Tree 是一种特殊的二叉树 它改善了二叉树节点查找的效率 二叉查找树有以下性质 对于任意一个节点 n 其左子树 left su
  • 编程语言发展简史

    编程语言发展简史 一 编程的起源 二 第一代计算机语言 机器语言 三 第二代计算机语言 汇编语言 四 第三代计算机语言 高级语言 2022年4月 TIOBE编程排行榜 https www tiobe com tiobe index 高级语言
  • 计算机网络-详细版

    鉴于有人需要离线版的PDF文档 这里给出本文章的PDF版本 下载地址如下 https pan itnxd cn 123Pan csdn share computer network pdf 一 计算机网络体系结构 0 脑图 1 计算机网络概
  • 面试/笔试第三弹 —— 数据库面试问题集锦

    写在前面 找工作告一段落 期间经历了很多事情 也思考了许多问题 最后也收获了一些沉甸甸的东西 成长和一些来自阿里 百度 京东 sp 华为等厂的Offer 好在一切又回到正轨 接下来要好好总结一番才不枉这段经历 遂将此过程中笔者的一些笔试 面
  • 用tensorflow实现基本的word2vec

    Basic word2vec implementation through tensorflow from future import absolute import from future import division from fut
  • idea 工程目录横向变纵向【亲测可用】

    idea 目录横向变纵向往上搜好多都没啥用 下面亲测可用三步走 1 删除项目文件夹下的 idea文件夹 横向时点击 project 然后在 idea 下右击 Delete 就好了 2 关闭IDEA 3 重新用IDEA工具打开项目 然后就 O
  • 计算机组成原理——存储器(一)

    存储器 一 一 存储器概述 二 存储器的分级结构 三 主存储器的技术指标 四 存储器与CPU的联系 地址总线 CPU与存储器的联系 编址方式 1 按字编址 M N 方式 2 按字节编址 五 SRAM存储器 cache 1 存储元基本结构 2
  • 计算机基础操作

    1 计算机软件 计算机软件可以使计算机按照事先预定好的顺序完成特定的功能 计算机软件按照其功能划分为系统软件与应用软件 系统软件 DOC Disk Operating System Windows Linux Unix Mac Androi
  • 关系代数之连接 (Join)和除(Division)

    关系代数之连接 Join 和除 Division 数据库技术中这两个概念 对初学者而言 理解比较困难 本文对此进行深入浅出的解释 连接 Join 联接 定义 从两个关系的笛卡尔积中选取属性间满足一定条件的元组 记作 其中A和B分别为R和S上
  • Win10使用.bat命令 获取本机设备信息/MAC信息/IP信息,转存为txt文件并保存至目标目录

    精简版 echo off title kotori poi color 0a echo 计算机S N码 gt dp0systemcheck txt wmic bios get serialnumber find v SerialNumber
  • 【数学公式】Mathpix和MathType等等

    MathML MathML指 数学标记语言 是XML语言的一个子集 用来在web网页 甚至部分软件中显示数学公式 简言之 就是使用特殊的类似HTML的标记在网页中显示数学公式 MathType公式编辑器 MathType是一个强大的数学公式
  • 软件设计命名规范

    1 命名约定 Pascal和Camel命名约定 编程的命名方式主要有Pascal和Camel两种 Pascal 每个单词的首字母大写 例如ProductType Camel 首个单词的首字母小写 其余单词的首字母大写 例如productTy
  • 一个栈的入栈序列是 a,b,c,d,e,则栈的不可能的输出序列是( ) 。

    一个栈的入栈序列是 a b c d e 则栈的不可能的输出序列是 a edcba b decbac dceab d abcde 堆栈讲究先进后出 后进先出 选项1是abcde先入栈 然后依次出栈 正好是edcba 选项2是abcd先依次入栈
  • 图解Git

    基本用法 上面的四条命令在工作目录 暂存目录 也叫做索引 和仓库之间复制文件 git add files 把当前文件放入暂存区域 git commit 给暂存区域生成快照并提交 git reset files 用来撤销最后一次git add
  • 通过wireshark抓取telnet登陆密码

    笔者学校有一台设备 ip地址是 192 168 84 10 先打开wireshark捕获无线网卡 使用telnet登陆如图所示 按下回车 笔者这里输入的密码是 A603 现在回到wireshark停止抓包 并且在filter处输入如下的过滤

随机推荐

  • 【论文精读】Hierarchical Text-Conditional Image Generation with CLIP Latents

    Hierarchical Text Conditional Image Generation with CLIP Latents 前言 Abstract 1 Introduction 2 Method 2 1 Decoder 2 2 Pri
  • 怎样将自己的电脑变成一个服务器(本地服务器)

    你想将自己的电脑变成一个服务器吗 或许你还不知道我们自己的电脑也可摇身一变成为服务器 现在我分享一下把我们的电脑变为服务器的方法 工具 原料 电脑 步骤1 打开 修改电脑相关服务功能 1 1 点击 开始 打开 控制面板 2 2 打开 程序
  • 登录工程一:传统 Web 应用中的身份验证技术

    标题中的 传统Web应用 这一说法并没有什么官方定义 只是为了与 现代化Web应用 做比较而自拟的一个概念 所谓 现代化Web应用 指的是那些基于分布式架构思想设计的 面向多个端提供稳定可靠的高可用服务 并且在需要时能够横向扩展的Web应用
  • 华为OD机试 - 比较两个版本号的大小(Java)

    题目描述 输入两个版本号 version1 和 version2 每个版本号由多个子版本号组成 子版本号之间由 隔开 由大小写字母 数字组成 并且至少有一个字符 按从左到右的顺序比较子版本号 比较规则如下 子版本号前面的0不参与比较 比如
  • 使用gSOAP与WebService - 第二部分 开发第一个WebService客户端(C++)

    CurrencyConvertor How use gSOAP and WebServices Part 2 Doing the first WS client Download Demo Project 42 1 KB Download
  • JSON空格转义(php、javascript)

    用input控件 存储json数据时 字符串有空格时报错 解决方法 进行空格转义 js文件 javascript var jsonData JSON stringify data replace s g nbsp var rowData
  • python读取图像并相加_python给图像加上mask,并提取mask区域实例

    python对图像提取mask部分 代码 coding utf 8 import os import cv2 import numpy as np def add mask2image binary images path masks pa
  • android nfc中Ndef格式的读写

    原文地址 检测到标签后在Activity中的处理流程 1 在onCreate 中获取NfcAdapter对象 NfcAdapter nfcAdapter NfcAdapter getDefaultAdapter this 2 在onNewI
  • 微信小程序 实现天气类功能

    参考链接 1 全国城市天气预报 城市天气预报查询 国内天气预报查询 天气网 https www tianqi com chinacity html 2 获取实时天气数据 获取数据 开发指南 微信小程序SDK 高德地图API https lb
  • apache字体文件跨域_css引用跨域字体文件woff,eot,ttf问题

    今天把站点的字体的静态文件woff eot ttf放到cdn去速度快一些 改成了外链地址 居然不加载报错 用下面的公用地址可以正常使用 https cdn bootcss com font awesome 4 7 0 fonts 搜索下 是
  • H5 页面采坑记录

    1 页面布局时 上下滑动页面时通常会把一些盒子放在 section section 标签中 但是在一些机型如iphonex测试中 上下滑动页面会出现都抖动的情况 不知道什么原因 解决方案就是 不使用 section 标签 直接在大盒子中写滚
  • 多线程之常用线程安全类型分析

    写在前面 本文一起看下在日常工作中我们经常用到的线程安全的数据类型 以及一些经验总结 1 常用线程安全数据类型 1 1 jdk集合数据类型 jdk的集合数据类型分为两类 一种是线性数据结构 另外一种是字典结构 分别看下 1 1 1 线性数据
  • 通过PyInstaller打包报“文件遇到错误”

    前言 不知道大家在作为python程序后 是不是都通过PyInstaller打包给用户使用呢 但是通过PyInstaller打包会出现一点小小的问题 本文章就来教你如何去解决这些问题 让打包后显示出控制台窗口 在打包的时候 不用加上 w让窗
  • 解码(二):音视频解码上下文创建配置和打开avcodec_open2打开演示

    如下代码 视频解码器打开 找到视频解码器 AVCodec vcodec avcodec find decoder ic gt streams videoStream gt codecpar gt codec id if vcodec cou
  • 远期与期货

    概述 期货合约与远期合约都是规定在将来的某一时间购买或者出售某项资产 这一点与期权类似 关键不同之处在于 期权持有者不会被强制购买或者出售资产 当无利可图时 可以选择放弃交易 但是 期货或者远期合约由必须履行事先约定的合约义务 远期 仅仅是
  • Java Lombok 报错(IllegalAccessError: class lombok.javac.apt.LombokProcessor)解决方法

    本文主要介绍Java 中 使用Lombok报错 java java lang IllegalAccessError class lombok javac apt LombokProcessor的解决方法及示例代码 原文地址 Java Lom
  • Java Swing 如何让界面更加美观

    文章目录 一 设置窗体的背景图 二 设置Button组件 三 设置字体大小和颜色 四 设置组件的背景色 五 综合测试案例 一 设置窗体的背景图 利用JLable类的构造方法或方法加载图片 ImageIcon image new ImageI
  • 设计一个雇员Employee类

    题目内容 设计一个雇员Employee类 具体要求如下 1 设计雇员Employee类 记录雇员的情况 包括姓名 年薪 受雇时间 String name double salary MyDate start 2 定义MyDate类作为日期
  • 装系统时提示 无法在驱动器0分区上安装windows

    先看提示 先看提示 先看提示 1 在重装系统时遇到一个问题 无法在驱动器0分区上安装windows 2 解决方法 1 在当前安装界面按住Shift F10调出命令提示符窗口 2 输入diskpart 按回车执行 3 进入DISKPART命令
  • 负数为什么要用补码来表示?

    上篇文章讲了 负数在计算机中是怎么存储的 看完之后 应该对原码 反码 补码有了基本的了解了 今天 我们深入探讨一下 为什么计算机中要用补码来表示负数 首先 我们应该清楚 原码是方便给人看的 看到一个数的原码 我们就能根据符号位和后边的二进制