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

大家都在看

  • Python函数的必选参数、默认参数、可变参数、关键字参数和命名关键字参数

    必选参数 def function(args_name): print (args_name) function("参数调用") ~$ 参数调用 跟在函数名口号…

    Linux 2023年6月7日
    077
  • Spring MVC处理日期字符串参数自动转换成后台Date类型

    当前台提交日期字符串到后台时,以字符串形式传输,若后台接收时采用Date类型,则会报格式转换错误的异常. 方式一: 将 @DateTimeFormat(pattern = &amp…

    Linux 2023年6月14日
    098
  • .NET使用StackExchange.Redis

    csharp;gutter:true; using StackExchange.Redis; using System; using System.Collections.Gene…

    Linux 2023年5月28日
    096
  • windows下使用route添加路由

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0111
  • redis之SDS

    SDS:的优点1.获取长度复杂度为O(1)2.避免strcat内存重分配(可能涉及系统调用), 通过[预分配策略]和[惰性空间释放]实现 3.以二进制存储,主要是安全设计,若存储的…

    Linux 2023年5月28日
    092
  • linux root用户编辑文件提示没有权限

    linux root用户编辑文件提示没有权限 感觉很奇怪,因为是root用户。于是查看了一下文件的权限,结果如下: [root@localhost elasticsearch-5….

    Linux 2023年6月8日
    0108
  • 缓存提升性能的关键性手段

    提高「性能」的主要方式是优化,而优化的其中一个主要手段就是添加缓存! 在软件工程里有这么一句话:「没有银弹」!就是说由于软件工程的复杂性,没有任何一种技术或方法能解决所有问题!软件…

    Linux 2023年6月14日
    097
  • 命令大全目录

    linux 本文来自博客园,作者:ivanlee717,转载请注明原文链接:https://www.cnblogs.com/ivanlee717/p/16341641.html O…

    Linux 2023年6月7日
    0146
  • PyTorch介绍-保存和加载模型

    本节我们将会看到如何保存模型状态、加载和运行模型预测 import torch import torchvision.models as models 保存和加载模型权重 PyTo…

    Linux 2023年6月14日
    0100
  • 关于如何在window下执行SQLSERVER的定时备份

    引言 在使用SqlServer Express 版本的时候发现,这个版本不支持通过数据库的代理方式进行数据库的维护。 解决方案 使用SQL语句加windows任务计划的方式解决具体…

    Linux 2023年6月14日
    0101
  • 基于Redis实现分布式锁

    背景在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等。大部分的解决方案是基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成…

    Linux 2023年5月28日
    0112
  • 数据结构 栈与队列

    cpp;gutter:true;</p> <h1>include</h1> <h1>include</h1> <h…

    Linux 2023年6月13日
    093
  • 微信小程序开发(1)

    微信小程序开发(1) 微信小程序开发(1) 代码结构与基本配置 代码结构与基本配置 基本HelloWorld创建 开发框架——基本构成 微信开发者工具 版本控制 WXML wxml…

    Linux 2023年6月8日
    0105
  • nginx配置文件讲解及示例(可复制)

    【示例一】 运行用户 user www-data; 启动进程,通常设置成和cpu的数量相等 worker_processes 1; 全局错误日志及PID文件 error_log /…

    Linux 2023年6月6日
    086
  • USB配置工具CH34xSerCfg使用说明

    一、概述 CH34xSerCfg配置软件用于WCH USB转串口系列芯片进行USB参数配置,通过该工具可对芯片的厂商识别码VID、产品识别码PID、最大电流值、BCD版本号、厂商信…

    Linux 2023年6月7日
    092
  • linux DMA接口

    1.1. 一致性DMA映射(Consistent DMA mappings ) 主要用于映射长时间使用的区域。 CPU和DMA controller不需要考虑cache的影响。 1…

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