【转载】: 一文回顾计算机组成原理

407 阅读26分钟

一、概述篇

1.1 发展史

计算机的发展一共有四个阶段:

  • 第一阶段:电子管计算机。第一台电子管计算机是:埃尼阿克(ENIAC)(下图)。

image.png

  • 晶体管(下图)计算机。比较出名的计算机:TX-0(全世界第一台)和PDP-1(带有屏幕)。

image.png

  • 第三阶段:集成电路计算机。操作系统在此诞生(IBM开发)。

image.png

  • 第四阶段:超大规模集成电路计算机。一个芯片集成上百万个晶体管,比如CPU。

image.png

未来可能还有生物计算机、光子计算机、量子计算机等。腾讯和阿里巴巴(达摩院)有量子计算机实验室。

image.png

1.2 计算机的分类

  1. 超级计算机

    • 功能最强,运算速度最快,存储容量最大的计算机。
    • 应用于高科技领域,比如天气预报,加密解密,核聚变等。
    • 运算速度单位:TFlop/s = 每秒一万亿次浮点计算。
    • 就比如:Intel® Core™ i7-6700K CPU @ 4.00GHz ,它的算力是(百度):44.87 GFlop/s,转换:44.87 GFlop/s = 0.04487TFlop/s。也就是该CPU的算力比起超级计算机的CPU的算力十分之一都不到。
    • 2019/6/17的记录:美国的两台超级计算机“顶点”(Summit)和“山脊”(Sierra)仍占据世界排名前两位,中国超算“神威·太湖之光”和“天河二号”在世界排名第三和第四名。
  2. 大型计算机

    • 又称大型机、大型主机、主机等。
    • 具有高性能,可处理大量数据与复杂的运算。比如金融交易的数据,证券交易所的数据等。
    • 在大型机市场领域,IBM占据着很大的份额,IBM比较出名的大型计算机:IBM Z9。造价很贵,所以市场越来越小。
  3. 迷你计算机(服务器)

    • 也称为小型机,普通服务器。
    • 具备不错的算力,可以完成较复杂的运算。
    • 常见的普通服务器制造商:联想,华为,浪潮。云服务是建立在这基础上的。 现在很多都是使用迷你计算机。
  4. 工作站

    • 高端的通用微型计算机,提供比个人计算机更强大的性能。

    • 类似于普通台式电脑,体积较大,但性能强劲

image.png

  1. 微型计算机

    • 又称为个人计算机,是最普通的一类计算机,我们现在用的。

1.3 计算机的体系和结构

1.3.1 冯诺依曼体系
  • 定义:将程序指令和数据一起存储的计算机设计概念结构。

现代计算机都是冯诺依曼计算机,具有如下功能:

1. 把需要的程序和数据送至计算机中。
2. 必须具有长期记忆程序、数据、中间结果及最终运算结果的能力。
3. 能够完成各种算术运算、逻辑运算和数据传送等数据加工处理的能力。
4. 能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作。
5. 能够按照要求将处理结果输出给用户。

为了实现该功能,计算机必须具备五大基本组成部件

运算器:用于完成各种算术运算、逻辑运算和数据传送等数据加工处理。
控制器:用于控制程序的执行,是计算机的大脑。运算器和控制器组成计算机的中央处理器(CPU)。控制器根据存放在存储器中的指令序列(程序)进行工作,并由一个程序计数器(简称PC)控制指令的执行。控制器具有判断能力,能根据计算结果选择不同的工作流程。
存储器:用于记忆程序和数据,例如:内存。程序和数据以二进制代码形式不加区别地存放在存储器中,存放位置由地址确定。
输入设备:用于将数据或程序输入到计算机中,例如:鼠标、键盘。
输出设备:将数据或程序的处理结果展示给用户,例如:显示器、打印机。

image.png

但是,冯诺依曼有一个瓶颈:CPU和存储器速率之间的问题无法调和。CPU的速率一定是快于存储器的速率。所以就有了现代计算机的结构。

image.png

1.3.2 现代计算机的结构

现代计算机在冯诺依曼体系结构基础上进行修改,但是主要来解决CPU与存储设备之间的性能差异问题。

image.png

但是存储器广义上是指磁带和硬盘,这里指的是内存和CPU的寄存器。

1.4 计算机的层次

1.4.1 编译程序和解释程序

计算机不能理解我们的自然语言(比如:hello world),只能识别二进制。开发人员需要做的就是把自然语言转成高级语言,然而高级语言还需要自行转行,需要翻译程序转换成计算机可识别的语言。

翻译程序:把高级语言翻译成机器语言(目标程序),可分为编译程序和解释程序。

  • 编译程序:也称为编译器,以高级编程语言的源程序作为输入,一次性翻译成以汇编语言或机器语言表示的目标程序作为输出。不过目标程序还需要经过链接才可以运行。链接就是目标程序和依赖库等串联起来。

    编译程序需要经历:词法分析、 语法分析、中间代码生成、代码优化、目标代码生成。

  • 解释程序:也可以称为解释器(直译器),把高级编程语言的源程序一行一行直接转译执行。而不是一次性把整个程序都转译,像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行。比如JS写好了就直接运行。

C、C++、Pascal、GO、最近火起来的swift等属于编译程序的语言,Python、PHP、JavaScript、Ruby等属于解释程序的语言。Java、C#属于编译+解释程序的语言。

image.png

汇编程序:把汇编语言翻译成机器语言。

编译程序

  • 优点:编译一次就行,执行多少次都不会再编译了,除非修改了原代码。

  • 缺点:像我们平常在使用java时,每次改动源程序就要重新编译一下,当然现在我们用idea,eclipse等编辑器是把javac和java命令封装在一起的,每次按下run其实就是在重新编译然后执行。

解释程序

  • 优点:不停机维护,有良好的兼容性。

  • 缺点:每次运行又得一行一行的转译。

1.4.2 计算机的层次与编程语言

目前的计算机分层:以后可能会变。

image.png

从底往顶:对于硬件的了解就行。

硬件逻辑层(了解):门、触发器等逻辑电路组成,属于电子工程的领域。
微程序机器层(了解):编程语言是微指令集。微指令所组成的微程序直接交由硬件执行
传统机器层(了解):编程语言是CPU指令集(机器指令)。编程语言和硬件是直接相关,不同架构的CPU使用不同的CPU指令集,比如intel生产的CPU所使用的CPU指令集不适合于AMD生产的CPU,不兼容。
到此:一条机器指令对应一个微程序,一个微程序对应一组微指令(微指令集)。

操作系统层:向上提供了简易的操作界面,向下对接了指令系统,管理硬件资源。操作系统层是在软件和硬件之间的适配层。
汇编语言层:编程语言是汇编语言,汇编语言可以翻译成可直接执行的机器语言,完成翻译的过程的程序就是汇编器。
高级语言层:编程语言为广大程序员所接受的高级语言,高级语言的类别非常多,常见的高级语言有:Python、Java、C/C++、Go等。
应用层:满足计算机针对某种用途而专门设计,像我们的office办公软件等。

1.5 计算机的计算单位

1.5.1 容量单位

计算机物理层面用高低电平记录信息,高电平使用1,低电平使用0。0/1称为bit(比特位),但是0/1能够表示的内容太少了,所以推出更大容量的表示方法——字节:1Byte = 8bits。

但是随着时代进步,字节也还是太少了,所以有了以下更高的容量单位:

image.png

注意:

  • 只有bit和Byte的转换比较特殊,永远记住:1Byte = 8bits。
  • 然后从Byte到EB,相邻的转换都是1024倍(或2^10倍)。
1.5.2 速度单位
  • 网络速度
    • 在计算机网络也有说了,网络常用单位为Mbps或者M/s或Mbit/s。
    • 像家里搞了联通100M的宽带,但是实际自己测试时不是100M,你可以注意一下电脑显示网速的单位,是MB/s或者KB/s。注意大写B(Byte)和小写b(bit)。所以联通的100M宽带在计算机上显示为:100Mbps / 8 = 12.5 MB/s,并且是指理论上可以到达的最高网速。

CPU频率

- CPU的速度一般体现为CPU的时钟频率。主流CPU的时钟频率都在2GHz以上。
- CPU的时钟频率的单位一般是赫兹(Hz)。
- 赫兹(Hz):指的是每秒中的周期性变动重复次数的计量。假设蝴蝶的翅膀挥动的频率是15Hz,则表示每秒能挥动15次。像CPU的时钟频率为2GHz,表示每秒20亿次运算。

1.6 计算机的字符集与编码

字符集(编码字符集):一组字符

字符编码:把字符集中的字符编码为特定的二进制数,以便在计算机中存储。

1.6.1 字符编码集的历史
  • ASCII码:使用7个bits就可以完全表示ASCII码,包含95个可打印字符,33个不可打印字符(包括控制字符)。ASCII即是字符集也是字符编码。ASCII码表相信在各大教材书都有,需要记住小写字母a和大写字母a的ASCII码,以十进制来记:小写字母a为97,大写字母A为65。因为字母有26个,那么B和b的ASCII通过A和a就可以知道了。

  • Extended ASCII码:很多应用或者国家中的符号都无法表示,比如数学符号:“÷ ≠ ≥ ≈ π”,所以扩展ASCII码表。

  • 字符编码集的国际化(ISO):世界上不同国家有不同语言,不以有限字符组合的语言,所以需要一个统一的标准。比如英文就26个字母组合,而中文的字符就更加复杂而且多。

1.6.2 中文编码集

GB2312:我国最先出现的字符集,全称为《信息交换用汉字编码字符集——基本集》,一共收录了 7445 个字符,包括 6763 个汉字和 682 个其它符号。

GBK:GB2312不满足国际化标准,所以推出GBK。全称为《汉字内码扩展规范》,向下兼容GB2312,向上支持国际ISO标准,收录了21003个汉字,支持全部中日韩汉字。不论是GB2312还是GBK都是本地化编码,也就是在中国使用是没问题的,但是跨国使用就有问题,外国人要访问中国网站会乱码,除非他们手动在本地安装GB2312或GBK编码。所以推出了Unicode。

Unicode:兼容全球的字符集,中文称为:统一码、万国码、单一码。Unicode定义了世界通用的符号集,UTF-*实现了字符编码。UTF-8以字节为单位对Unicode进行编码。

二、组成篇

2.1 计算机的总线

2.1.1 总线概述

提供了对外连接的接口,也促使外部设备接口的统一。 比如USB(Universal Serial Bus,通用串行总线)接口,使得 不同设备可以通过USB接口进行连接。

image.png

假设没有总线的计算机,当连接上外部设备时,如下图,线路会变得更加复杂。

image.png

当有了总线后:

image.png

2.1.2 总线的分类

可分为片内总线和系统总线

1、片内总线:芯片内部的总线,连接寄存器与寄存器,连接寄存器与控制器、运算器。比如CPU的内部。

image.png

2、系统总线:是连接CPU、主内存、IO设备、各组件之间的信息传输线

image.png

系统总线还可以分为三类:

  • 数据总线:双向传输各个部件的数据信息。数据总线的位数(总线宽度)是数据总线的重要参数,一般与CPU的位数相同(32位,64位)。

  • 地址总线:指定源数据或目的数据在内存中的地址。地址总线的位数与存储单位有关,如果地址总线的位数位n,则寻找范围为:0~2^n。

  • 控制总线:是用来发出各种控制信号的传输线,它可以监视不同组件之间的状态(就绪/未绪)。控制信号经由控制总线从一个组件发送给另一个组件。

2.1.3 总线仲裁

假设主存要跟硬盘和IO设备交换数据,当硬盘和IO设备都处于就绪状态,此时的总线是要给硬盘使用呢?还是给IO设备使用?机器不知道,所以会造成冲突,类似线程中的死锁。所以需要仲裁器。

仲裁器:为了解决不同设备使用总线的优先顺序,或者说解决不同设备对总线使用权的问题。

2.2 输入输出设备

2.2.1 常见的输入设备

可分为两种:字符输入设备和图形输入设备

字符输入设备:键盘

图形输入设备:鼠标、扫描仪

2.2.2 常见的输出设备

比如显示器,打印机,投影仪

image.png

额外的:硬盘即属于输入设备,又属于输出设备

2.2.3 主机与IO设备的接口
  • 数据线:是IO设备与主机之间进行数据交换的传送线。即可单向传输也可双向传输。

  • 状态线:IO设备状态向主机报告的信号线。为了查询设备是否已经正常连接并就绪、也可以查询设备是否已经被占用。

  • 命令线:CPU向设备发送命令的信号线。可发送读写信号和启动停止信号。

  • 设备选择线:主机选择IO设备进行操作的信号线。对连在总线上的设备进行选择。

2.2.4 CPU与IO设备通信

程序中断

当外部IO设备就绪时,向CPU发出中断信号,然后CPU就会停止当前执行的主程序,转去处理IO设备。待IO设备处理完,就会返回刚刚中断的位置,继续执行刚刚的主程序。

image.png

DMA(直接存储器访问)

因为程序中断会降低CPU的使用效率,所以提供DMA设备,一般存在在硬盘、外置显卡中。

DMA直接连接主存与IO设备,当DMA工作时不需要CPU的参与。

2.3 存储器

2.3.1 存储器的分类
  • 按存储介质分类:

    • 半导体存储器:比如内存、U盘、固态硬盘。
    • 磁存储器:在金属或塑料表面涂抹一层磁性物质,比如磁带、磁盘(普通硬盘)。
  • 按存取方式分类:

    • 随机存取存储器(RAM):随机读取,与位置无关。有两种:静态随机存取存储器(SRAM)和动态静态随机存取存储器(DRAM)。现在的内存条是DRAM。

    • 串行存储器:与位置有关,按顺序查询。

    • 只读存储器(ROM):只读不写或者很少进行更改的。比如BIOS。

2.3.2 存储器的层次结构

image.png

  • 缓存:CPU中的寄存器、高速缓存(现在焊接在CPU中,里面有一级缓存L1、二级缓存L2、三级缓存L3,不信可以打开任务管理器,点击性能,点击CPU,就可以看到L1、L2、L3)。

  • 主存:计算机中的内存。我们常说的内存条(DRAM,动态随机存取存储器)。

  • 辅存:计算机的外部存储设备,比如U盘,磁盘,移动硬盘。

也可以按下面的图来表示层次结构,其主要思想是:存储器层次结构的思想是上一层次的存储器是低一层次的高速缓存。 比如一级缓存是二级缓存的高速缓存,二级缓存是三级缓存的高速缓存,三级缓存是主存的高速缓存,主存是辅存的高速缓存。因为辅存的速度是最慢的,所以我们要避免CPU访问辅存取数据,所以交给主存利用DMA去跟辅存打交道(搬运数据到内存),需要什么数据还是得由CPU来控制。

image.png

缓存-主存层次:

原理:局部性原理。(下面有解释)
实现:在CPU与主存之间增加一层速度快(容量小)的Cache。
目的:解决主存速度不足的问题。

主存-辅存层次:

原理:局部性原理。
实现:主存之外增加辅助存储器(磁盘,SD卡,U盘等)。
目的:解决主存容量不足的问题。 

局部性原理:可分为时间局部性、空间局部性、顺序(算法)局部性。

  • 时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。(比如程序循环、堆栈等)

  • 顺序局部性(Order Locality):在典型程序中,除转移类指令外,大部分指令是顺序进行的。(比如指令的顺序执行、数组的连续存放)

  • 空间局部性(Spatial Locality):结合顺序局部性,在最近的将来将用到的信息很可能与正在使用的信息在空间地址上是临近的,也称为预存。

所以有了局部性原理,保证了CPU能高速工作,当我们第一次打开某个程序时,可能会比较慢,过一段时间第二次重新打开时(不是关机重启),发现变快了。因为第一次的时候,程序的相关链接库没有加载进内存,需要从磁盘读取,所以慢,第二次打开因为链接库在内存里面(内存也属于经常访问的),所以快。这里的打开慢,我们只考虑链接库,因为打开慢的原因可能有很多(比如CPU正在忙,内存不够等),而且对于一台牛逼的电脑(高级的CPU, 固态硬盘,内存条等)第一次打开可能感受不到慢。

2.3.3 主存储器

image.png

主存储器也就是我们的内存条,英文名为:RAM(随机存取存储器,Random Access Memory),更准确的说应该称为:DRAM(动态随机存取存储器)。DRAM通过电容存储数据,必须隔一段时间刷新一次,所以一旦掉电(漏电),那么一段时间内后将丢失数据。

DRAM(动态随机存取存储器):每个存储单元所需的场效应管较少,常见的有4管,3管和单管型DRAM。因此它的集成度较高,功耗也较低,但缺点是保存在DRAM中的信息不是永久的,如果掉电,那么一段时间后将丢失数据。

SRAM(静态随机存取存储器):工作速度快,只要电源不撤除,写入SRAM的信息就不会消失,不需要刷新电路,同时在读出时不破坏原来存放的信息,一经写入可多次读出,但集成度较低,功耗较大。一般作为高速缓冲存储器(Cache)。

主要区别DRAM需要刷新地储存数据,SRAM不需要刷新地储存数据;相同的是一旦关机或断电,DRAM和SRAM数据都没有了。

image.png

2.3.4 辅助存储器

这里只谈磁盘。断电后数据还会保持在磁盘中。

image.png

磁盘的调度算法:(操作系统的重要内容)

  • 先来先服务算法:根据进程对磁道的请求序列(读取磁道)移动磁头。简单,公平,但效率不高,可能移动的磁头一会最外一会最内,增加了服务时间,对机械也不利。

  • 最短寻道时间算法:根据进程对磁道的请求序列,每次移动到离它当前磁头位置最近的磁道。性能比“先来先服务”好,但是会造成饥饿的现象(某些访问请求长期等待得不到服务。)。

  • 扫描算法(电梯算法):根据进程对磁道的请求序列和当前磁道方向,从当前磁道方向开始移动,到最外圈或最内圈后,再从刚刚初始磁道位置移动到最内圈或最外圈。( 最外圈<-初始位置->最内圈 )。寻道性能较好,可避免“饥饿”现象,但是不利于远离磁头一端的访问请求。

  • 循环扫描算法:跟扫描算法不同的是:从当前磁道方向开始移动,到最外圈或最内圈后,再从相反方向移动到初始位置。( 最内圈<-最外圈<-初始位置->最内圈->最外圈 类似一个环)相比于扫描算法,循环扫描算法消除了对两端磁道请求的不公平。

2.3.5 高速缓存

先了解主存的一些概念:

  • 字:是指放在一个存储单元中的二进制代码组合。一个字可表示一个指令/一个数据/一个字符串。一个字中的二进制位的位数称为字长,字长可以是8位、16位、32位等。

  • 字块:存储在连续的存储单元中而被看作是一个单元的一组字。就是一个块包含几个字。

image.png

高速缓存替换策略有几种:(也就是算法)

  • 随机算法:每一次需要替换时,随机选取高速缓存中的位置,把该位置的数据替换道需要的数据即可。速度快,但效率低。

  • 先进先出算法(FIFO):顾名思义,类似队列,优先移除最先进入队列的字块,后来的再添加到队尾。

  • 最不经常使用算法(LFU):优先淘汰(移除)掉最不经常使用的字块。所以需要额外的空间来记录字块的访问次数。

  • 最近最少使用算法(LRU):优先淘汰一段时间内没有使用的字块,有多种实现方法,一般使用双向链表。每次使用的字块都会被拉到链表前(保证链表头是最近使用的),太久没使用的最终会被放到最后,然后当链表满了要添加数据时就会把链表尾的淘汰掉。

2.4 计算机的指令系统

2.4.1 机器指令的形式

机器指令主要由两个部分组成:操作码和地址码。

image.png

  • 操作码:指明指令所需完成的操作,它的位数反映了机器的操作种类。比如操作码为8位时,可以完成2^8(256)种操作。

  • 地址码:给出操作数(操作数:规定了指令中进行数字运算的量)或操作数的地址。地址码可分为三地址码指令、二地址码指令、一地址码指令,还有零地址指令。

image.png

image.png

image.png

零地址指令:在机器指令中无地址码,比如空操作,停机操作,中断返回操作等。

2.4.2 机器指令的寻址方式
  • 指令寻址:

      顺序寻址:在一段连续的地址读取指令。
      跳跃寻址:在某一地址突然跳到另一个不相邻的地址。
    
  • 数据寻址:

      立即寻址:指令直接获得操作数,无需访问存储器。
    
  • 直接寻址:直接给出操作数在主存中的地址,寻址操作数简单,无需计算数据地址。

  • 间接寻址:指令地址码给出的是操作数地址的地址。需要访问一次或多次主存来获取操作数。

image.png

2.5 控制器

控制器是协调和控制计算机运行的。

运算器只能完成运算,而控制器用于控制整个CPU的工作,它决定了计算机运行过程的自动化。它不仅要保证程序的正确执行,而且要能够处理异常事件。一般包括:指令控制逻辑、时序控制逻辑、总线控制逻辑、中断控制逻辑。

指令控制逻辑要完成取指令、分析指令、执行指令,过程分为取指令、指令译码、按指令操作码执行,形成下一条指令地址等步骤。

控制器的组成:

image.png

程序计数器(PC) 具有寄存信息和计数两种功能,不存储结果。

  • 程序计数器用来存储下一条指令的地址。
  • 循环从程序计数器中拿出指令。
  • 当指令被拿出时,指向下一条指令。

时序发生器:

  • 电气工程领域,用于发送时序脉冲。
  • CPU依据不同的时序脉冲有节奏的进行工作。

指令译码器:

  • 指令译码器是控制器的主要部件之一。
  • 计算机指令由操作码和地址码组成。
  • 翻译操作码对应的操作以及控制传输地址码对应的数据。

指令寄存器:

当cpu执行一条指令时,先把它从内存储器取到缓冲寄存器中,再送入IR暂存,指令译码器根据IR的内容产生各种微操作指令,控制其他的组成部件工作。

  • 指令寄存器也是控制器的主要部件之一。
  • 从主存或高速缓存取计算机指令。

主存地址寄存器:

  • 保存当前CPU正要访问的内存单元的地址。

主存数据寄存器:

  • 保存当前CPU正要读或写的主存数据。

通用寄存器:

  • 用于暂时存放或传送数据或指令。
  • 可保存ALU(算术逻辑单元)的运算中间结果。
  • 容量比一般专用寄存器要大。

2.6 运算器

运算器是用来进行数据运算加工的。

运算器的组成:

image.png

数据缓冲器

  • 分为输入缓冲和输出缓冲。
  • 输入缓冲暂时存放外设送过来的数据。
  • 输出缓冲暂时存放送往外设的数据。

ALU:(重要)

  • ALU:算术逻辑单元,是运算器的主要组成。
  • 常见的位运算(左右移、与或非等)。
  • 算术运算(加减乘除等)。

状态字寄存器:

  • 存放运算状态(条件码、进位、溢出、结果正负等)。
  • 存放运算控制信息(调试跟踪标记位、允许中断位等)。

通用寄存器:

  • 用于暂时存放或传送数据或指令。
  • 可保存ALU的运算中间结果。
  • 容量比一般专用寄存器要大。

2.7 计算机指令执行的过程

image.png

可以看出,如果按照上面的执行过程,可得控制器和运算器不能同时工作,这就导致了CPU的综合利用率不高,所以提出了CPU的流水线设计,直接看图:

image.png

三、计算篇

3.1 进制

3.1.1 概述

进位制是一种记数方式,亦称进位计数法或位值计数法,以有限种数字符号来表示无限的数值。使用的数字符号的数目称为这种进位制的基数或底数。

常见的有:二进制,八进制,十进制,十六进制。

二进制:以01来组成的数。
八进制:以0~7来组成的数。
十进制:以0~9来组成的数。十进制是给我们看的,因为容易理解。
十六进制:以0~9AB、C、D、E、F来组成的数。像内存地址,网卡的MAC地址。
3.1.2 进制的转换

3.2 有符号数与无符号数

针对二进制来说可以分为两种:

  • 有符号数:有正负值。使用最高二进制位来表示符号,这一位被称为符号位(Sign bit)。人们规定,符号位为 0 表示正数,符号位为 1 表示负数。范围:-2^(n-1) ~ 2^(n-1)-1 (其中n为二进制数的位数)

  • 无符号数:无负值。范围:0 ~ 2^(n-1)-1 (其中n为二进制数的位数)

假设二进制以8位为例,有符号数得把最高位作为符号位,那么其余7位来表示二进制数,而无符号数8位都可以表示一个二进制数,所以有符号数可表示的最大值比无符号数可表示的最大值小:

  • 有符号数可表示的最大值:01111111 -> 127(最左边,也就是最高位为符号位,所以可表示的范围只有后7位)

  • 无符号数可表示的最大值:11111111 -> 255(没有符号位的概念)

对于有符号数可表示的最小值,比较特殊,通过上面的公式,有符号数可表示的最小值为-128,这里有个问题?为什么是-128而不是-127,不应该是11111111(最高位为符号位)???等学了补码和反码在补充!因为其实-128是用补码表示的。

Java中没有无符号数,C++有。

有符号数可以分为正值,原码、反码、补码四种编码实现。

正值:其实就是求出一个数的绝对值的二进制数,不看符号位。比如-3的正值:0011;4的正值:0100。后面要用该知识。

3.3 定点数

计算机中处理的数据经常带有小数点,而小数点在计算机中有两种表示方式,一种就是定点数,另一种就是浮点数。

定点数:小数点固定在某个位置的数称为定点数。按照位置的不同,可分为两种:

定点小数:小数点默认位于数值部分的左边,整数位则用于表示符号位,称为纯小数(相对于二进制来说),但是小数点也是隐含的,即不占位。比如(都是二进制表示):0.001(十进制数为:0.125),1.0111(-0.45,假设保留4位小数点)等。

3.4 浮点数

浮点数:是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。

原文:

blog.csdn.net/weixin_4180…