plainchant
  • Welcome PCT‘s Blog
  • Golang
    • golang基础
      • Go 语言 select 的实现原理
      • golang数字最大值
      • go-defer
      • Channel实现
      • go逃逸分析
      • Golang调度
  • Linux
  • Linux开发
    • 查看磁盘的UUID并挂载
    • Linux内核开发示例
    • 误删Linux内核后修复系统
    • linux补丁的创建和应用
    • Git常用命令
    • SystemV消息队列使用范例
    • ubuntu搭建全局代理
    • linux安装和配置
  • 嵌入式
    • 计算机为什么存在补码
    • 一种可靠串口协议
    • CRC校验算法
    • RasperryPi3 Ros系统安装(Debian)
  • 套接字编程
    • TCP建立连接过程分析
    • 线程的分发
    • TCP的并发处理epoll
    • TCP的并发处理select
    • 非阻塞TCP示例
    • 阻塞TCP示例
    • UDP组播
    • UDP广播
    • 非阻塞UDP示例(fcntl方式)
    • 非阻塞UDP示例
    • 局域网发现协议
    • socket通信机制浅析-前言
  • 交友网站
  • 区块链
    • Wasm虚拟机
      • wagon外部参数和内部参数的统一
      • Wagon实现log函数的第二种方法
      • Wagon实现一个log函数
      • go版本wasm解析器分析
      • 解析wasm二进制文件
      • ONT实现API的流程
      • Wasm工具安装使用
    • BCH
      • SLP代币协议
    • Cosmos
      • 区块链共识进化史
      • Tendermint 的区块构成
      • CoinEx 链 Gas 费指南
      • CoinEx交易类型收集
      • Cosmos简介和环境搭建
    • ETH
      • Geth命令详解
    • BTC
      • 助记词到地址
  • 算法
    • 动态规划
  • HTTP
    • URL 在浏览器被被输入到页面展现的过程中发生了什么
  • 运维后台
    • Docker学习笔记
  • 数据型应用系统设计
    • 数据密集型应用系统设计读书笔记
    • 数据编码与演化
      • Kafka配置
      • protobuf简介
    • MySQL
      • mysql安装和数据目录变更
      • 深入理解事务
      • MySQL事务问题验证
    • Redis
      • Redis缓存实现
      • Redis基本概念
由 GitBook 提供支持
在本页
  • 原码,反码和补码
  • 原码
  • 反码
  • 补码
  • 微机原理
  • 加法器
  • 符号位的由来

这有帮助吗?

  1. 嵌入式

计算机为什么存在补码

原码,反码和补码

下面是大学的《微机原理》课程教材定义三种概念:

原码

规定正数的符号位为 0,负数的符号位为 1,其他位按照一般的方法来表示数的绝对值。用这样的表示方法得到的就是数的原码。

反码

对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。

补码

正数的补码与其原码相同,负数的补码为其反码在最低位加 1。

运算规则

类似于分配率:

微机原理

一般来说,我们理解上面的几条定义就可以用补码进行运算,也知道计算机是如何进行数值运算的。 但我们还需要往里追究一下,为什么计算机内部只存储数字的补码?

加法器

在电子学中,加法器(英语:adder)是一种用于执行加法运算的数字电路部件,是构成电子计算机核心微处理器中算术逻辑单元的基础。在这些电子系统中,加法器主要负责计算地址、索引等数据。除此之外,加法器也是其他一些硬件,例如二进制数的乘法器的重要组成部分。

符号位的由来

网络上关于补码最主要的争论是符号位的由来,像微机原理和一些教材,都认定最高的符号位是规定的,即最高位是0表示正数,最高位为1表示负数。 而一些人认为符号位不是规定的,而是由补码推演出来的,我们可以用一个例子看一下。 首先,我们认为没有符号位的定义,然后计算7-9:

注意,7-9在二进制中本是减不了的,因为7比9小,我们假设从再高位借1,那么就能得到1111 1110,类似于补码计算时溢出位1被忽略一样,这里再拿回来。 那么7-9最后得到的是1111 1110,按照我们上面的定义,-2的补码是什么呢?

可以看到,-2的表示和7-9借位结果是一样的,因此可以认为符号位其实是补码运算规则的附加产品。 不过这种争议的意义并不大,我们只需要理解补码是将减法转换为加法即可,依照这个思路的话,教材的方式确实更容易理解。

上一页嵌入式下一页一种可靠串口协议

最后更新于4年前

这有帮助吗?

加法器是由逻辑电路组成,逻辑电路则是由一些开合状态组成,计算机使用二进制作为计算度量也是因为二进制可以非常容易的被硬件模拟。 请注意,计算机里面,只有加法器,没有减法器,因此所有的减法运算,都必须用加法进行。 这就解释了我们为什么要存储所有数字的补码,在上面的第四条运算规则中,可以看到两个数的减法可以通过补码转换成两个数的加法,因此补码存在的意义就是为了解决减法运算问题。