万字长文通关计算机与操作系统基础知识(面试必备)

pivoteic
发布于 2023-9-22 11:54
浏览
0收藏

大家好,我是冰河~~

最近发现很多小伙伴工作很久了,大部分工作都是在重复的进行CRUD,对于一些基础性的知识,比如:计算机基础知识,操作系统,数据结构和算法等,却了解的少之又少。

其实,很多时候,这些基础性的知识往往是造成程序员职业生涯瓶颈的一个重要的因素。所以,冰河强烈建议这些基础知识越早知道越好,越早掌握越好!最好是在大学时期就充分掌握这些计算机基础知识。

好了,接下来,冰河为大家总结了一篇万字长文系统介绍计算机中有关数据方面的基础知识。

数据的表示形式

在计算机中,所有的数据都是以二进制的形式进行表示的,也就是说,在计算机中使用0和1来表示所有的数据。而我们日常生活中的数字都是10进制的,那我们平时使用的数字如果在计算机中表示时就需要进行进制的转换。

进制转换


R进制转10进制


R进制转10进制可以使用按权展开的方法,具体的操作就是:将R进制数的每一位数值使用R^k^表示,底数是R,指数是k。

其中,k与该位和小数点之间的位置有关。当这个位置位于小数据左边时,k的值是从小数点向左依次数的个数,需要注意的是:紧邻小数点的数字位置为0,接下来是1,2...依次类推。同样的,如果这个位置在小数点的右边,则紧邻小数据点位置的数字从-1开始,依次向右数为-2,-3等等,依此类推。

例如,我们给出一个二进制数字,11010101.01,转换为10进制数字为:1 x 2^7^ + 1 x 2^6^ + 0 x 2^5^ + 1 x 2^4^ + 0 x 2^3^ + 1 x 2^2^ + 0 x 2^1^ + 1 x 2^0^ + 0 x 2^-1^ + 1 x 2^-2^。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

再比如,我们给出一个八进制数,76128.01,转换为10进制数字为:7 x 8^4^ +6 x 8^3^ + 1 x 8^2^ + 2 x 8^1^ + 8 x 8^0^ + 0 x 8^-1^ + 1 x 8^-2^

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区


十进制转R进制


十进制转R进制就比较简单了,这里我们可以使用短除法。

例如,将十进制数字69转换为二进制的过程如下所示。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

得出短除的结果后,我们需要将余数倒过来排列即为十进制69转换为二进制的结果,所以结果数据为:1000101。


二进制与八进制互转


二进制转八进制时,每三位二进制数表示一个八进制数。因为在八进制中,总共有8个基数,分别是0~7,逢8进1。而如果要使用二进制来表示时,0的二进制为000,7的二进制为111,所以,每三位二进制数对应一位八进制数。反过来,每一位八进制数对应三位二进制数。

具体的划分策略是,从二进制的低位开始,从低到高,也就是从右向左,每三位二进制数对应一个八进制数,不足三位的前面补0,例如,我们将二进制数:10001110转化为八进制数的过程,具体如下所示。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

所以,二进制数10001110转化为八进制数的结果为216。

同理,八进制转二进制与二进制转八进制正好相反,八进制的每一位对应三位的二进制数。也就是说,将八进制数的每一位转化成三位的二进制数即可。


二进制与十六进制互转


在十六进制表示的数字中,总共有15个基数,为0~15,逢16进1。如果要将二进制数转化为十六进制数时,首先要弄清楚每位十六进制数需要多少为二进制数表示。

在十六进制中,最大的基数为15,15的二进制表示为:1111,最小的基数为0,0的二进制数为0000,也就是说,十六进制的基础使用二进制表示为 0000~1111,所以,每位十六进制数需要四位二进制数表示。

从二进制数的低位开始,也就是从右侧开始,每四位二进制数对应一位十六进制数。

例如,我们需要将二进制数10001110转换为十六进制数,如下所示。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

注意:在十六进制中,分别使用A,B,C,D,E,F代表10,11,12,13,14,15。

所以,二进制10001110转化为十六进制的结果为8E。

十六进制转二进制与二进制转十六进制正好相反,将十六进制的每一位转换为四位二进制数即可。

数据的码制

在计算机中,带符号的机器数可以采用原码、反码、补码和移码表示,这些编码称为码制。

原码

在原码表示中,最高位是符号位,0表示正号,1表示负号,其余的n-1位表示数值的绝对值,数值0的原码有两种表示形式:原 = 0 0000000,原 

反码

在反码中,最高位是符号位,0表示正号,1表示负号,正数的反码与原码相同,负数的反码是其绝对值按位取反。数值0的反码有两种表示形式:反 = 0 0000000,反 

补码

在补码中,最高位是符号位,0表示正号,1表示负号,正数的补码与原码和反码相同,负数的补码等于其反码的末位加1。在补码的表示中,0有唯一的补码:补  = 0 0000000,补 

移码

移码表示法是在数X上增加一个偏移量来定义的,常用于表示浮点数中的阶码。如果机器字长为n,规定偏移量为 2^n-1^。

实际上,在偏移 2^n-1^的情况下,只要将补码的符号位取反就可以获得相应的移码。

码制总结

我们来看下面的表格,这里,我直接使用八位的二进制数来表示相应的数值。

码制

数值1

数值-1

1-1

原码

0000 0001

1000 0001

1000 0010

反码

0000 0001

1111 1110

1111 1111

补码

0000 0001

1111 1111

0000 0000

移码

1000 0001

0111 1111

1000 0000

通过表格我们发现:

  • 正数的原码、反码和补码是相同的。
  • 负数的反码是原码除符号位外,其他位分别取反;
  • 负数的补码是其反码的末位加1。
  • 移码是在补码的基础上符号位取反得到。

在负数的原码和补码的转换中,我们可以得出如下结论:

  • 负数的原码转补码是在原码的基础上除符号位外,其他位取反,然后末位加1。
  • 负数的补码转原码是在补码的基础上除符号位外,其他位取反,然后末位加1。

也就是说,负数的原码转补码和补码转原码的规则是一样的。小伙伴们可以根据表格自行验证

计算机使用补码进行加减法运算

我们再来看表格的最后一列 1-1,在计算机中,表示为1+(-1),其正确的结果应该为0。接下来,我们分别分析下使用原码、反码、补码和移码进行加减法运算的结果的正确性。

  • 表格的第一行中,使用原码计算的结果为1000 0010,转换为10进制数为-2,1-1不等于-2,所以,使用原码进行加减法运算的结果是错误的。
  • 在反码中,计算1-1的结果为1111 1111,显然结果不为0,所以,使用反码进行加减法运算的结果是错误的。
  • 在补码中,计算1-1的结果为0000 0000,结果为0,所以,使用补码进行加减法运算的结果是正确的。
  • 在移码中,计算1-1的结果为1000 0000,结果为-0,虽然-0也等于0,但是严格意义来讲,这个结果是不正确的。

在计算机中,不会使用移码进行加减法运算,移码用于浮点数的阶码。

数值的表示范围

在计算机中,码制所表示的范围,可以分为定点整数和定点小数。在定点数中,小数点是固定的。定点整数就是说小数点在最低位的后面,也就是在最右面,此时的小数点可以忽略不写。定点小数就是小数点在最高位的前面,也就是在最左边。

值得注意的是:在定点整数和定点小数中,小数点都不占位数。所以,小数点在定点整数和定点小数中不会影响数值的范围。

我们可以将定点整数和定点小数的取值范围总结成下表所示。

码制

定点整数

定点小数

原码

-(2^n-1^ -1) ~ +(2^n-1^ -1)

-(1-2^-(n-1)^) ~ +(1-2^-(n-1)^)

反码

-(2^n-1^ -1) ~ +(2^n-1^ -1)

-(1-2^-(n-1)^) ~ +(1-2^-(n-1)^)

补码

-2^n-1^ ~ +(2^n-1^ -1)

-1~ +(1-2^-(n-1)^)

移码

-2^n-1^ ~ +(2^n-1^ -1)

-1~ +(1-2^-(n-1)^)

表格中的n表示机器的字长,也就是用多少位二进制数表示。

这张表小伙伴们不用死记硬背,说白了,这张表,冰河也记不住,那我们怎么办呢?不慌,这里,我给大家举一个例子。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

例如,我们这里使用4位机器字长来表示,为了理解方便,这里我用四个方框来表示4位二进制数。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

默认最高位为符号位,如下所示。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

这里我们先用4位二进制数表示定点整数,则最小值为1111,最大值为0111。

最小值1111表示如下。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

其转换成10进制数为-7。

最大值0111表示如下。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

其转换为10进制数为7。

这样,我们使用4位二进制数表示的范围,则可以计算出结果为:-7 ~ 7。也就是 -(2^4-1^ - 1)  ~ +(2^4-1^ -1),所以,当使用n位二进制数表示数值的范围时,我们可以得出数据的表示范围为:-(2^n-1^ - 1)  ~ +(2^n-1^ -1)

所以,我们根本就不需要记住定点整数和定点小数的取值范围表,只需要简单的使用一个实际的二进制位进行验算即可得出正确的结果数据。比如,我这里以4位二进制位进行验算举例。

还有一点需要注意的是:补码和移码比原码和反码少一个数,就是-0。另外,验证定点小数和验证定点整数的方式相同,小伙伴们可自行验证定点小数的值,这里,我就不再赘述。

如果我们使用8位二进制数表示,则定点整数的取值范围为:

1111 1111 ~ 0111 1111 转换为十进制数就是:-127 ~ 127,将二进制数转换为补码为:1000 0000 ~ 0111 1111。

其中,-128的补码为1000 0000是人为规定的。

如果使用8位二进制数表示,则定点小数的取值范围为:

-0.1111 1111 ~ +0.11111111,补码的范围为:-1~ + +0.11111111。

其中,-1的补码为1000 0000是人为规定的。

浮点数的运算


浮点数的表示

首先,我们先来看下浮点数的表示形式,浮点数的表示形式如下,

N = 尾数 * 基数^指数^

对于浮点数来说,我们最常说的就是圆周率 π,数学上常使用3.14来表示π的值,如果使用科学计算法的话,我们可以使用形如3.14 * 10^3^ 这样的数来表示。其中,在3.14 * 10^3^中,3.14表示尾数,10表示基数,3表示指数。

另外,3.14 * 10^3^ 可以写成多种形式,比如可以写成 0.314 *  10^4^,也可以写成0.0314 *  10^5^。

浮点数的存储格式

浮点数在计算机中的表示中,阶码是带符号的纯整数,尾数为带符号的纯小数。浮点数的表示格式如下所示。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

一个数的浮点数表示不是唯一的。当小数点的位置发生改变时,阶码也会相应的改变。可以使用多个浮点形式表示同一个浮点数。浮点数的数值范围主要由阶码决定,数值的精度则是由尾数决定的。

浮点数的运算过程

运算的过程要依次经历对阶、尾数计算和结果格式化三个阶段。

例如计算:3.14 * 10^3^ + 1.5 * 10^5^的结果数据。

首先,我们需要先进行对阶操作,这里有个原则就是小数向大树看齐,这里我们需要将3.14 * 10^3^进行对阶操作,转化成0.0314 * 10^5^,然后与1.5 * 10^5^进行相加操作,得出结果数据1.5314 * 10^5^。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

接下来,我们再来看看浮点数的特点。

浮点数的特点

浮点数的主要特点如下所示。

  • 一般尾数使用补码表示,阶码使用移码表示。
  • 阶码的位数决定数的表示范围,位数越多范围越大。
  • 尾数的位数决定数的有效精度,位数越多精度越高。
  • 对阶时,小数向大数看齐。
  • 对阶是通过较小数的尾数右移实现的。

计算机结构

计算机结构主要由运算器、控制器、存储器、输入设备和输出设备组成。简化的结构图如下图所示。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

接下来,我们再看看看其详细的结构图如下所示。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

其中,主存储器又叫做内存储器,也就是内存;辅助存储器又叫做辅存,也就是外存储器,例如磁盘;CPU的核心部件为运算器和控制器。

CPU由运算器、控制器、寄存器组和内部总线组成。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

运算器包含:算术逻辑单元、累加寄存器、数据缓冲寄存器、状态条件寄存器。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

  • 算术逻辑单元(ALU):数据的算术运算和逻辑运算。
  • 累加寄存器(AC):通用寄存器,为ALU提供一个工作区,用于暂存数据。
  • 数据缓冲寄存器(DR):写内存时,暂存指令或数据。
  • 状态条件寄存器(PSW):存储状态标志和控制标志,有时也可以将状态条件寄存器归为控制器部分。

控制器包含:程序计数器、指令寄存器、指令译码器、时序部件。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

  • 程序计数器(PC):存储下一条要执行的指令的地址。
  • 指令寄存器(IR):存储即将执行的指令。
  • 指令译码器(ID):对指令中的操作码字段进行分析解释。
  • 时序部件:提供时序控制信号。

计算机体系结构分类

首先,我们先来看一个在计算机领域中,对计算机的体系结构进行分类的一种经典方法,就是Flynn分类法,Flynn分类法将计算机分成单指令流单数据流、单指令流多数据流、多指令流单数据流、多指令流多数据流。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

具体信息如下表所示。

体系结构类型

结构

关键特性

代表

单指令流单数据流(SISD)

控制部分:一个  处理器:一个   主存模块:一个


单处理器系统

单指令流多数据流(SIMD)

控制部分:一个  处理器:多个   主存模块:多个

各处理机以异步的形式执行同一条机灵

并行处理机、阵列处理机、超级向量处理机

多指令流单数据流(MISD)

控制部分:多个  处理器:一个   主存模块:多个

被证明是不可能的,至少是不实际的

目前没有,有资料记载流水线处理机为此类

多指令流多数据流(MIMD)

控制部分:多个  处理器:多个   主存模块:多个

能够实现作业、任务、指令等各级全面并行

多处理机系统、多计算机

指令的基本概念

一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的格式如下所示。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

其中,操作码部分指出了计算机要执行什么性质的操作,例如,加法、减法、取数、存数等。地址码字段需要包含各操作数的地址及操作结果的存放地址等,从其地址结构的角度可以分为三地址指令、二地址指令、一地址指令和零地址指令。

三地址指令

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

例如,执行a+b=c操作时,就是使用的三地址指令。此时如下所示。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

二地址指令

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

例如,执行a+=b操作时,执行的就是二地址指令,此时如下所示。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

一地址指令

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区


例如,执行a++操作时,执行的就是一地址指令,此时如下所示。

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

零地址指令

万字长文通关计算机与操作系统基础知识(面试必备)-鸿蒙开发者社区

例如,宕机就是零地址指令。



文章转载自微服务:冰河技术

已于2023-9-22 11:54:25修改
收藏
回复
举报
回复
    相关推荐