理清计算机中的数据表示方法–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)

大家都在看

  • 超算TOP500中的Linux占比——Operating System&Operating System Family

    2022-09-18-21:28:59 老师作业说明: TOP500中国超算占比,LINUX系统占比 说明:当时使用的是bing搜索,中国超算占比其实澎湃新闻什么的都有介绍,但是我…

    Linux 2023年6月6日
    093
  • 渗透测试常用方法总结

    转载自 https://blog.csdn.net/qq_42636435/article/details/92839738 Original: https://www.cnblo…

    Linux 2023年6月7日
    071
  • Shell:Shell基础

    Shell基础 一、shell定义 shell是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指…

    Linux 2023年5月28日
    085
  • cube.js 即将使用cube store 替换redis

    随着发着cube store 的能力已经很强大了,官方目前计划使用cube store 替换redis cube.js 内存查询参考 官方对于redis 的说明 官方觉得redis…

    Linux 2023年5月28日
    0125
  • python正则表达式

    1.定义 正则表达式使用某种预定义的模式去匹配一类具有共同特征的字符串,主要用于处理字符串,可以快速、准确地完成复杂的查找、替换等处理要求。 re模块提供了正则表达式操作所需要的的…

    Linux 2023年6月7日
    0113
  • windows系统如何查看端口被占用、杀进程

    查看系统当前所有的端口使用情况 命令:netstat -ano 查看特定端口是否被占用: netstat -ano |findstr “端口号” 查看到对应…

    Linux 2023年6月13日
    0103
  • POJ3071(Football)–概率DP

    题意:有(1< en….网上当然也后不少解题报告,但是很多直接给出状态转移方程和贴出代码,而少了其中重要的推断过程,我觉得不是很好。所以自己给写一个较为详细的过程…

    Linux 2023年6月7日
    0103
  • ssh 或 putty 连接linux报错解决方法

    由于当天多次输入错误密码,ssh和putty就连接不上了,纠结了很久解决问题 ssh连接提示错误:server unexpectedly closed network connec…

    Linux 2023年6月13日
    093
  • ASP.NET Core设置URLs的几种方法

    前言 在使用ASP.NET Core 3.1开发时,需要配置服务器监听的端口和协议,官方帮助文档进行简单说明,文档中提到了4种指定URL的方法 设置 ASPNETCORE_URLS…

    Linux 2023年6月8日
    074
  • 【socket】基于poll和epoll通信温度上报

    网络socket通信 * – poll函数 – epoll函数 – poll代码实现 – epoll代码实现 poll函数 poll…

    Linux 2023年6月13日
    098
  • 罗德岛

    自从转行以后就建博了,一直没有动手写内容,今天开始写。 主要记录技术上的积累和项目上的工作感悟。 这里就是罗德岛,就在这里跳。 Original: https://www.cnbl…

    Linux 2023年6月6日
    080
  • 理论知识

    多线程的实现方式:1.继承Thread类;2.实现runnable接口;3.实现callable接口通过futrueTask包装器来创建Thread线程; 是继承Thread类号还…

    Linux 2023年6月7日
    0109
  • Git详细使用流程

    初始化git仓库 git init 执行命令后文件夹下将会在执行命令路径下生成.git隐藏文件上传该路径下的所有内容到暂存区 git add . 通常项目中都有read.me,创建…

    Linux 2023年6月7日
    0105
  • Linux 0.11源码阅读笔记-高速缓冲

    高速缓冲 概念 高速缓冲区是内存中的一块内存,它充当块设备和内核中其他程序之间的桥梁。如果内核程序需要访问块设备中的数据,则需要通过高速缓冲区进行间接操作。 [En] The hi…

    Linux 2023年5月27日
    073
  • 高速USB转8串口产品设计-RS485串口

    基于480Mbps 高速USB转8路串口芯片CH348,可以为各类主机扩展出8个独立的串口。使用厂商提供的VCP串口驱动程序,可支持Windows、Linux、Android、ma…

    Linux 2023年6月7日
    0112
  • 每天一个 HTTP 状态码 102

    102 Processing 是用于 WebDAV 请求的一种状态码… 102 Processing 102 Processing 是用于 WebDAV协议 请求的状态…

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