理清计算机中的数据表示方法–2’s complement

Bits

bits是信息的基本单元,计算机通过电压的高低来确定是0还是1;这里的电压是有一定范围的,0~a视为0,

a~b视为1,具体数字不用记

Data Types

同一个数字有不同的表达方式。当我们定义了一些数据的表示方法,同时定义了数据之间的操作之后,就是定义了 数据类型。

Unsigned Intergers

没什么可说的,就是无符号二进制数和十进制数之间的转换,很容易

Signed Integers

用五位二进制数举例子。(2^5=32),就是说用五位二进制数我们可以表示32个十进制数。考虑到符号的问题,我们可以考虑正数和负数对半开,+1 to +15, and -1 to -15。这样一来还剩下2个位置,我们可以选一个,比如00000来表示0这样我们就表示了-15到15的所有数。

接下来需要考虑的是,如何建立五位二进制数和十进制数之间的一一对应。

由于有k位,我们就用一半的二进制位来表示0到(2^{k-1}-1)的正数,最之间的方法就是用这些正数转换为二进制数之后其本身的值来表示,只需要把最高位留空(置为0)即可。所有正数的最高位都是0,最大的正数就是+15———>01111

那么,自然而然的,我们会想到直接把最高位的0换成1,不就可以表示负数了吗?这种方法叫做(signed-magnitude),

另一种方法,就是把已经表示出来的正数按位取反。比如:+5是00101,-5就是11010。这种方式叫做(1’s complement)

上述两种方式都不是正真在今天的计算机上使用的,因为在工程实际中,对于这样表示的数据,要实现运算必须设计一些不必要的繁杂电路。实际上,今天我们使用的方法是(2’s complemeny)

理清计算机中的数据表示方法--2's complement

2’s Complement Integers

从图2.1表中可以看到,2’s complement表示的范围是-16到15

正数和之前两种方法一样,没啥区别。

就像我们之前说的,负数表示的选择是基于让逻辑电路更加简单的愿望。几乎所有的计算机都使用相同的机制做加法,叫做(arithmetic) (and) (logict) (unit),也称ALU。

现在需要知道的是ALU有2个输入和1个输出,直接进行二进制的加法,如图:

理清计算机中的数据表示方法--2's complement

ALU一点也不关心它操作的是什么数,它只是机械的执行这个相加的操作。因此,最好让我们在十进制整数和二进制数之间建立的这种映射关系能对ALU的加法操作封闭。具体的说,就是我们要保证(A+(-A)=0)。因此我们需要仔细挑出负数的表示方式。实际上要实现这个,本质上要求:

represent(A)+ represent(1)= represent(A+1)

但是注意,由于我们的位数是有限的(比如前面的例子里都是五位二进制数),所以+1的操作不能让数无限大的增长。因为位数始终是有限的,所以最终的效果是整个实现一个取模运算。为了便于理解,我觉得可以把它想象成一个环。下面我以三位二进制数的1’s complement integers为例,演示一下这个周期性过程。

理清计算机中的数据表示方法--2's complement

显然,这个环上不能实现二进制加一等同于其代表的十进制数加一, 这是因为出现了-0和0。我们能想到的最简单的方法就是,给负数按位取反之后整个加1,想当于将负数域向前挪一个格子,变成下面的样子:

理清计算机中的数据表示方法--2's complement

如此一来,显然我们得到的就是一个连续的环。在这种表示下,就能实现很方便的加法运算了。

2’s complement integers的表示很好推,当我们拿到一个A后(不论是真是负),只需要按位取反再加1,就能得到-A。

Extending Conversion to Numbers with Fractional Parts

如果我们想用二进制数表示小数部分,又该怎么考虑?

Binary to decimal

比较简单,和十进制是一样的,从小数点后第一位起一次是2的-1、-2、-3次方

如.1011,我们的计算是:

[2^{-1}+2^{-3}+2^{-4}=0.5+0.125+0.0625=0.6875 ]

Decimal to binary

推导部分用手写了:

理清计算机中的数据表示方法--2's complement

因此,如果用4位二进制表示0.421的小数部分的话,可以表示为 .0110

Addition and Subtraction

加法直接算v

减法只需要给那个数取反加1后,再进行加法

Sign-Extension

有时候为了计算时有相等的位数,必须给前面补充位数。这里的要求是,如果是正数,前面全部补0不影响数的大小;如果是负数,前面全部补1不影响数的大小

Overflow

目前为止我们讨论的都是两个整数的和比较小的情况,以至于结果一定在可用位数能够表示的范围内。那如果超出范围了怎么办?

老式的那种仪表,比如一些汽车的里程表:可能显示的是99992,过了一会跳到00092了。这就是位数受限带来的麻烦,这时候我们就说里程表overflowed了。在计算机里面也会有这种情况。我们之前一直讨论的五位二进制数,如果用2’s complement的方法表示,其范围是-16到15。现在我们进行+9和+11的加法,

理清计算机中的数据表示方法--2's complement

得到的答案是-12。出现这种错误的原因是数值太大而导致了符号位上的进位。负数相加也有相同的问题。 但是注意:正数和负数相加永远不会出现这种问题v

Original: https://www.cnblogs.com/Ztyu279/p/16729070.html
Author: Ztyu279
Title: 理清计算机中的数据表示方法–2’s complement

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/577609/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java语言高级(第六部分)函数式接口 Stream流、方法引用 ->(个人学习记录笔记)

    第一章 函数式接口 1.1 概念 函数式接口在Java中是指: 有且仅有一个抽象方法的接口。 函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda…

    Linux 2023年6月8日
    090
  • Redis 集群

    三高架构:并发,性能,可用 主从复制 主从复制:将 master 中的数据即时、有效的复制到 slave 中 特征:一个 master 可以拥有多个 slave,一个 slave …

    Linux 2023年5月28日
    0113
  • Prometheus+Grafana监控-基于docker-compose搭建

    前言 Prometheus Prometheus 是有 SoundCloud 开发的开源监控系统和时序数据库,基于 Go 语言开发。通过基于 HTTP 的 pull 方式采集时序数…

    Linux 2023年6月7日
    094
  • 运算符重载限制

    p387 5.表 11.1 中的大多数运算符都可以通过成员或非成员函数进行重载,但下面的运算符只能通过成员函数进行重载。 =:赋值运算符。 ():函数调用运算符。 []:下标运算符…

    Linux 2023年6月13日
    0101
  • k8s之部署metrics-server 转载

    Metrics Server是Kubernetes内置自动缩放管道的可扩展,高效的容器资源指标来源。 Metrics Server从Kubelet收集资源指标,并通过Metrics…

    Linux 2023年6月14日
    084
  • CentOS 7 新系统 手动配置网络 简要步骤

    一、配置网卡文件 1.修改网卡文件进入网卡配置文件目录 2.查看网卡文件 CentOS中网卡文件一般为 ifcfg-ens* 这样的文件,多块网卡会有多个类似文件 3.编辑网卡文件…

    Linux 2023年6月8日
    089
  • 软件工程 软件需求与软件需求规约 第1篇随笔

    2、软件需求与软件需求规约 1. 何为需求? 定义问题的基本要素是 “需求” 一个需求是一个有关”要予构造”的陈述,用以描述待开发产…

    Linux 2023年6月7日
    0105
  • redis报错OOM command not allowed when used memory > ‘maxmemory’

    登录到redis上查询 ./redis-cli -h IP -p port -a passwdredis>info memory 查询,内存已耗尽 查询配置文件,发现之前配置…

    Linux 2023年5月28日
    0104
  • 自动化集成:Kubernetes容器引擎详解

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作; 本篇文章主要描述Kubernetes引擎用法。 …

    Linux 2023年5月27日
    0118
  • podman对容器映像签名和分发

    熟悉podman 如何使用 Podman 对容器映像进行签名和分发 熟悉podman 此示例容器将运行一个非常基本的 httpd 服务器,该服务器仅为其索引页提供服务 [root@…

    Linux 2023年6月7日
    098
  • django Middleware

    Middleware简介 Middleware是一个轻量级的,全局性质的Django请求/响应处理钩子框架。所谓钩子框架是指在request请求到达Django之后,views视图…

    Linux 2023年6月7日
    0106
  • rabbitmq-安装部署及基础操作

    yum 安装 rabbitmq # centos7 编译安装rabbitmq 在安装RabbitMQ中需要注意:1、RabbitMQ依赖于Erlang,需要先安装Erlang2、E…

    Linux 2023年6月14日
    0112
  • 带你了解我们的“彩虹运维技术栈社区”

    关于我们 彩虹象征着美好、童话、幻想,所要追求的成功,必历经挫折之后才能达到目标。我们每个人都需经历学习的枯燥、工作和生活的辛苦,不经历风雨又怎能见彩虹? TTR,全称Taste …

    Linux 2023年6月7日
    090
  • ztreejs树 metro风格 鼠标经过 显示用户自定义控件 新增,编辑,删除,向下,向上操作

    php;gutter:true; ztreejs树功能说明:自定义控件功能新增,编辑,删除,向下移动,向上移动已实现,只是前端,如果需要跟后台交互,封装对应的函数,在相应位置调用即…

    Linux 2023年6月7日
    091
  • IDEA远程部署项目到Docker

    最近在写东西部署到服务器,结构是springboot工程配合docker部署。但是每次部署都3个步骤: 部署次数一多,我就怀疑人生了。就在找有没有IDEA远程部署Docker的方案…

    Linux 2023年6月7日
    093
  • 九、磁盘管理

    (一)磁盘基础知识磁盘–硬盘(机械,固态) 磁盘结构https://www.jianshu.com/p/cf100e39ccdf 扇区、磁道、柱面 扇区默认大小是512…

    Linux 2023年6月7日
    0127
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球