如果不了解些计算机的基础知识上来就编程,往往容易“不识庐山真面目,只缘身在此山中”。因此对于计算机的一些基础知识,在开始编程前,需要理解和掌握。
计算机软件系统
计算机软件是控制计算机实现用户需求的计算机操作以及管理计算机自身资源的指令集合, 是指在硬件上运行的程序和相关的数据及文档, 是计算机系统中不可缺少的主要组成部分,可分成两大部分:系统软件和应用软件。
系统软件是计算机最基本的软件,它负责实现操作者对计算最基本的操作, 管理计算机的软件与硬件资源, 具有通用性, 主要由计算机厂家和软件公司开发提供。 主要包括操作系统、语言处理程序、数据库管理系统和服务程序 。
1.操作系统是控制和管理计算机的软硬件资源、 合理安排计算机的工作流程以及方便
用户的一组软件集合, 是用户和计算机的接口。操作系统主要有windows、UNIX、linux和Mac OS X。
windows操作系统是由微软公司开发,大多数用于我们平时的台式电脑和笔记本电脑。个人电脑常用的系统有windows XP、windows 7和windows 10等等。微软还开发了适合服务器的操作系统,像windows server 2000,windows server 2003。
UNIX基本都是安装在服务器上,没有用户界面,基本上都是命令操作。
linux系统算是UNIX的孩子吧,他继承了UNIX的许多特性,还加入自己的一些新的功能有的linux有界面有的没有。系统有:Red Hat,ubuntu,CentOS,Debian等
Mac OS X是苹果公司开发的操作系统,也是基于UNIX上面开发的。他有着良好的用户体验,华丽的用户界面和简单的操作。
2.语言处理程序: 将用汇编语言和高级语言编写的源程序翻译成机器语言目标程序的程序。
3.数据库管理系统: 是对计算机中所存储的大量数据进行组织、 管理、查询并提供一定处理功能的大型计算机软件。
4.服务程序:为计算机系统提供各种服务性、辅助性的程序。
应用软件是指除了系统软件以外的所有软件,是为解决实际问题所编写的软件的总称,涉及到计算机应用的各个领域。绝大多数用 户都需要使用应用软件,为自己的工作和生活服务。如字表处理软件 WPSoffice 、Word、Excel 等。
根据上述软硬件资源的关系,人们通常把一台完整的计算机划分成四个结构层次,称为四个平台。它 们从底层到高层分别为硬件平台、系统平台、应用支持平台和应用平台。与用户直接相关、打交道最多的 是应用平台。
指令是一组二进制代码,它规定了计算机执行程序的一步操作。
一条指令包含操作码和地址码两个部分,操作码指示计算机怎么操作,必不可少,地址码指定操作对象或操作数据在存贮器中的存放位置,可以没有。
格式:
程序:为解决某一问题而设计的一系列指令。
指令系统:计算机能识别并能执行的全部指令的集合。
计算机语言
程序就是一系列的操作步骤,计算机程序就是由人事先规定的计算机完成某项工作操作步骤。每一步骤的具体内容由计算机能够理解的指令来描述,这些指令告诉计算机“做什么”和“怎么做”。编写计算机程序所使用的语言称为程序设计语言。
通常分为三类:机器语言、汇编语言和高级语言。
计算机最早的语言处理程序是机器语言,它是计算机直接识别的语言,速度快。最早的程序员把指令按0101的方式敲在纸袋上,想想就知道有多么费劲。
机器语言
机器语言是用二进制代码编写计算机程序的,因为又称二进制语言,属于低级语言。
例如用机器语言来表示“8+4”这个算式,是一串二进制码“00001000 00000100 00000100”。
机器语言是其它计算机语言的基础,因为计算机硬件只能识别0/1的二进制,无论后面的计算机语言如何发展,最终在计算机内能够执行的只能是0/1的二进制编码,故而后面所有的计算机语言都需要一个翻译的东西,将其翻译为二进制的编码执行,这个起着翻译官作用的就是编译器或解释器。
机器语言优点是最底层,速度最快,缺点是最复杂,开发效率最低。
汇编语言
汇编语言用助记符代替了操作码,用地址符号或标号代替地址码。这样就用符号代替了机器语言的二进制码。汇编语言也称为符号语言。比起机器语言,汇编大大进步了。尽管还是复杂,用起来容易出错,但在计算机语言发展史上是机器语言向更高级的语言进化的桥梁。
比如:MOV AL,20H;//将8位数据20H传送到AL寄存器,就是赋值语句
用汇编语言编写的源程序不能被计算机直接识别,必须使用某种特殊软件将用汇编写的源程序翻译和连接成能被计算机直接识别的二进制代码。
汇编语言优点是比较底层,速度最快,缺点是复杂,开发效率最低。
高级语言
高级语言是一种接近于人们使用习惯的程序设计语言。
高级语言所编写的程序不能直接被计算机识别,必须经过转换才能被执行,按转换方式可分为2类:
1.编译类
事先编好一个叫做编译程序的机器语言程序放在计算机中,当高级语言编的源程序输入计算机时,编译程序就把整个源程序自动翻译成用机器指令表示的目标程序。使用比较方便、效率较高,但源程序一旦需要修改,必须先修改再重新编译整个源程序才执行,跨平台性较差,如C、C++、Delphi、Pascal、Fortran等。
2.解释类
事先编好一个叫做解释程序的机器语言程序放在计算机中,当高级语言源程序输入计算机后,解释程序自动地逐句翻译源程序,译一句执行一句。
使用效率比较低,依赖解释器,跨平台性好,如Python,Php,ASP,Ruby,Java等
编译的结果是另外一种语言,而解释的就是一种中间语言。
计算机高级语言的发展分为两个阶段,以 1980 年为分界线,前一阶段属于结构化语言或者称为面向过程的语言(C、fortran),后一阶段属于面向对象的语言(C++、java)。
面向对象语言的发展有两个方向:一种是纯面向对象语言,如Smalltalk、EIFFEL等;另一种是混合型面向对象语言,即在过程式语言中加入类、继承等成分,如C++、Objective-C等。
计算机数制基础
什么是数制?
所谓数制,就是人们利用符号来计数的科学方法,又称为计数制。
数制有很多种,例如最常使用的十进制,钟表的六十进制(每分钟60秒、每小时60分钟),年月的十二进制(一年12个月)等。
无论哪种数制,都包含两个基本要素:基数和位权。
基数
在一个计数制中,表示每个数位上可用字符的个数称为该计数制的基数。
位权
是以基数为底、数字所在位置的序号为指数的整数次幂。
计算机中常用的数制的表示如表所示。
进位制 | 计数规则 | 基数 | 各位的权 | 可用数符 | 后缀字符标识 |
二进制 八进制 十进制 十六进制 | 逢2进1 逢8进1 逢10进1 逢16进1 | 2 8 10 16 | 2i 8i 10i 16i | 0,1 0,1,…,7 0,1,…,9 0,1,…,9,A,B,C,D,E,F | B O D H |
计算机中常见的各种进制数之间的对应关系见下表
十进制 | 二进制 | 八进制 | 十六进制 |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 | 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 | 0 1 2 3 4 5 6 7 8 9 A B C D E F |
二进制
在现代电子计算机中,采用0和1表示的二进制来进行计数。为什么计算机中使用二进制进行计数,而不采用其他计数制呢?
(1)二进制使用0和1进行计数,相应地对应两个基本状态。对于物理元器件而言,一般也都具有两个稳定状态,这些可以用0和1两个数码来表示。
(2)二进制数的运算法则少,运算简单,使计算机运算器的硬件结构大大简化。
(3)二进制的0和1可以对应逻辑中的真和假,可以很自然地进行逻辑运算。
进制转换
二进制最方便计算机处理但不方便人观看,但不同的进制间可以进行相互转换。二进制可以转换为10进制,16进制等。例如10进制的数字8,用二进制表示为:1000,16进制表示为0x08
信息编码和基本运算
信息编码
信息(包括图像、符号、图形和声音等)需要按照规定好的二进制形式表示才能被计算机处理,这些规定的形式就是信息编码。(其实就是把信息转化为0和1)
原码, 反码, 补码
原码, 反码, 补码是机器存储一个具体数字的编码方式。在计算机中,整型数通常以二进制补码的形式进行存储和表示。这种编码方式使得计算机在进行加法和减法运算时更加高效和方便。
1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:[1111 1111 , 0111 1111],即[-127 , 127]。
原码是人脑最容易理解和计算的表示方式。
反码的表示方法是:正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值,通常要将其转换成原码再计算。
3. 补码
补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。(即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的,通常也需要转换成原码在计算其数值。
现在我们知道了计算机可以有三种编码方式表示一个数。对于正数因为三种编码方式的结果都相同:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
但是对于负数:
[-1] = [10000001]原 = [11111110]反 = [11111111]补
可见原码, 反码和补码是完全不同的. 既然原码才是被人脑直接识别并用于计算表示方式, 为何还会有反码和补码呢?
主要为了计算机的运算。为使计算机运算的设计更简单,机器可以只有加法而没有减法。
首先来看原码:
计算十进制的表达式: 1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的。这也就是为何计算机内部不使用原码表示一个数。
为了解决原码做减法的问题, 出现了反码:
计算十进制的表达式: 1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的。这也就是为何计算机内部不使用原码表示一个数。
发现用反码计算减法, 结果的真值部分是正确的, 而唯一的问题其实就出现在"0"这个特殊的数值上。虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0。
于是补码的出现, 解决了0的符号以及两个编码的问题:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了。而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128。 但是注意因为实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示。(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)
使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]。
因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-2^31, 2^31-1] 因为第一位表示的是符号位,而使用补码表示时又可以多保存一个最小值。
字节
在计算机中,字节是数据存储的基本单位,由8个连续的二进制位组成。一个字节能够表示256种不同的状态,范围从00000000到11111111(或十进制的0到255)。计算机中存储容量通常以字节为单位进行表示。例如1KB(千字节)等于1024字节,1MB(兆字节)等于1024KB,以此类推。字节通常简写为“B”,而位通常简写为小写“b”。
字节是计算机存储和传输数据的基本单位,它代表了计算机中最小的可寻址的存储单元。在计算机中,所有的信息都以二进制的形式存储和处理,而字节就是用来表示二进制数据的单位。
一个字节由8个二进制位组成,每个二进制位可以表示0或1。通过组合这些位,我们可以表示256个不同的值(2的8次方),包括数字、字母、符号和其他特殊字符。这些值可以用于表示文本、图像、音频和视频等各种数据类型。
字节的概念最早出现在20世纪50年代的计算机领域。当时的计算机存储器非常昂贵,因此需要一种紧凑的表示方式来存储数据。字节的引入使得计算机可以以更高的存储效率来处理数据。
字节不仅在计算机存储器中有着重要的作用,而且在计算机网络中也扮演着关键的角色。在网络传输中,数据以字节的形式进行分组和传输。字节的大小决定了网络传输的速度和效率。较小的字节大小可以提高传输速度,但也会增加传输过程中的开销。因此,在网络设计中需要权衡字节大小和传输效率之间的关系。
字节的大小还与计算机的体系结构和操作系统有关。在一些早期的计算机体系结构中,字节的大小可以是6位、7位或9位。然而,现代计算机普遍采用8位字节,这是因为8位字节在存储和处理数据时更加高效和便捷。
除了字节,还有一些其他的存储单位,如位(bit)、千字节(kilobyte)、兆字节(megabyte)和千兆字节(gigabyte)等。这些单位都是基于字节的倍数,用于表示不同大小的存储容量。例如,一个千字节等于1024个字节,一个兆字节等于1024个千字节,以此类推。
总结起来,字节是计算机中最小的可寻址的存储单元,用于表示和处理二进制数据。它在计算机存储器和网络传输中起着重要的作用,并且是计算机体系结构和操作系统的基本构建块之一。字节的概念和大小对于程序员来说至关重要,因为它直接影响着数据的存储、处理和传输效率。
字节序
字节序指的是大于一个字节类型的数据在内存中的存放顺序。大小端是一种常见的字节序类型,具体分为以下两种:
- Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
- Little-Endian(小端):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
这两种字节序的不同之处在于数据在内存中的存储顺序不同。在跨平台和网络编程中,需要考虑字节序的问题,以避免数据在不同平台之间传输时出现错误。
例如,对于一个32位的整数0x12345678来说,
在大端模式下,这个整数在内存中按照以下顺序存储:
0x12 0x34 0x56 0x78
而在小端模式下,这个整数在内存中按照以下顺序存储:
0x78 0x56 0x34 0x12
计算机网络
计算机网络就是利用通信线程和设备,把分布在不同地理位置上的多台计算机连接起来,在功能完善的网络软件(网络协议、网络操作系统等)的支持下,实现计算机之间数据通信和资源共享的系统。
计算机网络是计算机技术与通信技术相结合的产物。
网络中计算机与计算机之间的通信依靠协议进行。协议是计算机收、发数据的规划。主要包括IP和TCP协议。
网络的发展
面向终端的第一代计算机网络
以单个主机为中心的远程联机系统,实现了地理位置分散的大量终端与主机之间的连接和通信,各终端通过通信线路共享昂贵的中心主机的硬件和软件资源。
以分组交换网为中心的第二代计算机网络
以分组交换网络为中心,主机都处在网络的外围。用户通过分组交换网可共享连接在网络上的许多硬件和各种丰富的软件资源。
以网络互联为核心的第三代计算机网络
通常将网络之间的连接称为“网络互连”,最常见的网络互连的方式就是通过“路由器”等互联设备将不同的网络连接到一起形成可以互相访问的“互联网”。著名的Internet就是目前世界上最大的一个国际互联网。
网络协议
网络体系结构
网络体系结构(architecture)是计算机网络的各层及其协议的集合,即:这个计算机网络及其部件所应完成的功能的精确定义。
ISO/OSI参考模型:
OSI参考模型(开放系统互联参考模型)由ISO组织提出,目的是实现异种机互连。“开放”表示任何两个遵守OSI标准的系统可以互连。“系统”指计算机、终端或外部设备等。
与OSI参考模型相关的协议已经很少使用,但是该模型本身是非常通用的,并且仍然有效,在每一层上讨论到的特性也仍然非常重要。
TCP/IP体系结构:
TCP/IP体系结构是Internet所使用的体系结构,目的是用于网络互连,是事实上的工业标准(从这个意义上说,ISO/OSI参考模型可以说是法律上的国际标准)。
TCP/IP体系结构的模型本身并不非常有用,但是协议却被广泛使用开了,TCP和IP协议是其中最重要的两个协议。
IP地址
IP地址是给互联网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内唯一的32位的标识符。IP地址通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6)
IP地址将IP地址空间划分为A、B、C、D、E五类(其中A、B、C是基本类,D、E类作为多播和保留使用),都是由网络ID和主机ID两部分组成。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。
每类地址最前面的几位为类别为,A,B,C类地址的类别位分别为0,10,110
D类地址用于多播
E类地址保留为今后使
A类地址
A类地址的网络号只有126个,原因如下:
全0:表示“本网络”
全1:保留作为本地软件环回测试(loopback test)
B类地址
128.0.0.0不指派
C类地址
192.0.0.0不指派
其他资源
你知道整型数据在内存中是如何存储的吗?(新手小白必看)_内存整型数据_南 极 熊的博客-CSDN博客