C++从入门到精通 第0章:计算机基础知识

181 阅读6分钟

信息的储存

用01串表示各种信息

1.在计算机内,信息是用0和1来储存的

2.bit是储存的最小单位,一般用“b”表示

3.8b=1B(一个字节),1024B=1KB,1024KB=1MB,1024MB=1GB,1024GB=1TB

4.用01串表示字符的规则叫做编码,常见的有:ASCII编码、Unicode编码

5.图片、视屏、音频也可以用01串表示

二进制与十六进制

我们平时用的是十进制,有十个数字:0~9

而K进制就是逢K进1

假设有一个n+1位的K进制数:AnAn1A2A1A0A_nA_{n-1}···A_2A_1A_0

则它的值为i=0nAi×Ki\sum_{i=0}^nA_i×K^i

二进制、十六进制互换

二进制变十六进制:每4位变成十六进制,左边不足补0

十六进制变二进制:每位变成二进制,除去前导零

二进制十六进制
0001000111
0010001022
0011001133
0100010044
0101010155
0110011066
0111011177
1000100088
1001100199
10101010AA
10111011BB
11001100CC
11011101DD
11101110EE
11111111FF

十进制变成K进制

设要转换的数为A

1.记录A mod K的值

2.记录A除以K值的整数部分

3.重复上述操作直至得到零

4.将步骤1记录的值倒序连在一起即可

原码、反码、补码

原码:最高位是符号位(0表示正数,1表示负数),剩下的表示绝对值

反码:正数的反码就是原码,负数的反码是原码除符号位取反(0变1,1变0)

补码:正数的补码就是原码,负数的补码是反码加1(可能有溢出,溢出的话去掉最高位)

整数与小数的计算机表示

一个计算机是几位的,说的是CPU中通用寄存器的位数(这里的位数指bit)

整数

用它的补码表示

小数

定点数:已经规定整数部分的位数与小数部分的位数

浮点数:表示成M×2EM×2^E的形式,M、E及其符号的位数都是有规定的(规定会因为CPU厂家、型号的不同而不同)

计算机程序设计语言

机器语言

计算机可以直接执行的指令就是机器语言,由01串组成

每条机器语言是什么格式、完成什么功能,都是由CPU的设计者事先规定好的

有机器语言组成的程序,叫做可执行文件

下面这个程序,可以把两个数相加

1000 0001 0000011000000000
1000 0010 1000000000000000
1100 0001 0010
1001 0001 0000110000000000

上面的每条指令,高四位表示指令所要进行的操作,其余部分表示操作对象

第1条指令:“1000”表示将数据从内存复制到寄存器,“0001”表示将数据复制到1号寄存器,“0000011000000000”表示数据来源于这个内存地址,这条指令表示将内存地址0000011000000000存放的数据复制到1号寄存器

第2条指令:同理,这条指令表示将内存地址1000000000000000存放的数据复制到2号寄存器

第3条指令:“1100”表示进行加法操作,这条指令表示将1号寄存器与2号寄存器存放的数据加起来,结果存放到1号寄存器

第4条指令:“1001”表示将数据从寄存器复制到内存,这条指令表示这条指令表示将1号寄存器存放的数据复制到内存地址0000110000000000

可以看到机器语言非常麻烦,用它来编程我们不得不记住每一条二进制代码,于是就出现了汇编语言

汇编语言

汇编语言与机器语言的主要区别就是将难记的指令变成英文助记符:“1100”->“ADD”、“1000”->“MOV”,甚至还将1号寄存器变成“AX”,2号寄存器变成“BX”,并且还能加标点符号、用十六进制代替二进制

刚才那个加法的例子用汇编语言写如下

MOV AX,0600
MOV BX,8000
ADD AX,BX
MOV 0C00,AX

很明显,汇编语言比机器语言好用多了,在用汇编器把它编译成机器语言就变成可执行文件了

虽然如此,但是入门的门槛还是太高了,我们必须对指令系统乃至硬件都非常了解,并且不可移植,于是就出现了高级语言

高级语言

高级语言是接近自然语言的编程语言的总称

前面那个加法的例子用高级语言写如下

c=a+b

可以看到,用高级语言编程,空间的配置根本不需要我们操心,只需要关注程序的逻辑即可

并且高级语言的编程跟硬件没有太大关系,所以只要稍加改动甚至不改动就可以在不同环境运行

这个过程叫做移植

高级语言的历史

1955年 FORTRAN:主要用于科学计算

1960年 ALGOL 60:首次引入局部性、递归、BNF范式等概念

1964年 BASIC:简单易学,面向初学者

1968年 Pascal:结构化程序语言

1970年 C:面向硬件,效率高

1983年 C++:向下兼容C,同时引入面向对象和泛型编程

1991年 Python:简单易学,具有许多丰富且强大类库,容易移植

1994年 PHP:网站开发语言

1995年 Java:移植方便,几乎不用改动

2003年 C#:模仿Java并改进

小结

1.在计算机中,所有信息都是由01串表示的,二进制的4位正好对应十六进制的1位

2.在计算机中,整数是由补码表示的

3.在计算机中,小数大多是由浮点数(M×2EM×2^E)表示的,浮点数包括:M、M的符号、E、E的符号

4.机器语言用01串进行编程的;汇编语言用助记符代替01串;高级语言比较接近自然语言