【第一节】编程知识基础概念


前言

        本系列文章会从浅入深的介绍c语言的学习流程,结合个例代码和实战项目手把手教会你入门c语言编程。


一、计算机与二进制

        二进制(binary)是在数学和数字电路中以2为基数的记数系统,是以2为基数代表系统的二进位制1。

        这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示。每个数字称为一个比特(Bit,Binary digit的缩写)。二进制数据是用0和1两个数码来表示的数。其基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。

        二进制广泛用于计算机和其他依赖计算机的设备中,如CPU、内存、硬盘等。因为数字计算机只能识别和处理由‘0’、‘1’符号串组成的代码,其运算模式正是二进制。它用于描述已编译的软件程序,一旦程序被编译,它就会包含称为“机器代码”的二进制数据,可以由计算机的CPU执行。

二、计算机与逻辑电路

1.逻辑学与数学

        逻辑学的起源可以追溯到古希腊时期。在古希腊哲学家巴门尼德和恩培多克勒斯对逻辑学做出了一些贡献,巴门尼德提出了一种叫做四项范畴的分类系统,用来描述和分析事物的属性和关系。恩培多克勒斯则提出了演绎推理的方法,认为通过对前提的正确推理可以得出正确的结论。而古希腊哲学家亚里士多德被公认为逻辑学的奠基人,他在其著作《逻辑学》中系统地阐述了逻辑学的基本原理和方法。亚里士多德提出了命题逻辑和演绎推理的基本理论,建立了逻辑学的基础。

        布尔代数是由英国数学家乔治·布尔在19世纪中叶提出的一种代数系统,它是一种特殊的代数结构,由集合以及定义在这个集合上的二元运算和一元运算构成,它为研究思维规律(逻辑学)提供了数学工具。其中的与,或,非这三种逻辑运算是布尔代数的基础,由此有了数学处理逻辑问题的开始。

2.逻辑电路

        逻辑学与计算机扯上关系就得说到克劳德·艾尔伍德·香农这个人物,他在1938年发表了著名论文《继电器和开关电路的符号分析》,首次用布尔代数对开关电路进行了相关的分析,并证明了可以通过继电器电路来实现布尔代数的逻辑运算,同时明确地给出了实现加、减、乘、除等运算的电子电路的设计方法。在攻读博士学位期间,香农除了继续研究开关理论,还进行微分分析器的研究。这种分析器是早期的机械模拟计算机,用于获得常微分方程的数值解。与或非三种电路图如下所示。现代计算机的核心cpu里面就存在这些无数的逻辑电路来控制二进制数据来进行运算。


三、程序与编程语言

1.程序与编程语言的关系

        计算机程序是一系列指令或操作的集合,用于告诉计算机执行特定的任务或解决特定的问题。它是计算机软件的重要组成部分,通过编程语言编写,并由计算机按顺序执行。

        程序可以用于执行各种任务,例如处理数据、控制硬件设备、实现算法、创建图形界面等。它们包含了逻辑、条件语句、循环、函数、数据结构、变量等元素,以指定计算机需要执行的具体操作。

        程序通常由多个模块或函数组成,每个模块负责处理特定的任务或功能。通过组合这些模块,程序可以实现更复杂的功能和任务。

        计算机程序在计算机中以可执行文件的形式存在,可以直接在计算机上运行。编程人员可以使用各种编程语言(如C、C++、Java、Python等)来编写程序,并使用编译器或解释器将其转换为可执行文件。

        计算机程序的目的是通过自动化和自动执行的方式来解决问题或完成任务,从而提高工作效率和准确性。它们是计算机科学和软件开发的核心内容。

        计算机是不懂人类使用的自然语言的,程序要想将我们的指令传达给计算机让它去执行,这就需要用到计算机编程语言。

        计算机是机器,人和计算机交流,也需要解决语言问题,需要创造一种计算机和人都能识别的语言,这就是计算机编程语言。

2.编程语言

        编程语言是一种用于编写计算机程序的形式化语言。它们被设计用来与计算机进行交互,向计算机提供指令并描述要执行的任务。

        编程语言允许开发人员使用特定的语法和规则,以逻辑和结构化的方式编写代码。每种编程语言都有自己的语法和语义,定义了如何组织代码、声明变量、控制程序流程、处理数据等。

        编程语言可以分为不同的类型和层次,包括低级语言(如汇编语言)、高级语言(如C、Java、Python)、脚本语言(如JavaScript、Ruby)和领域特定语言(如SQL用于数据库查询)等。每种编程语言都有其特定的用途和优点,以满足不同类型的编程需求。机器指令不被通常被看作是一种编程语言。机器指令是一种用于直接控制计算机硬件的二进制指令,它们是计算机能直接执行的最底层指令。

        用编程语言写的程序,CPU 是不认识的,它只认识二进制的指令,那么我们想让自己写的程序能够在计算机上执行,那么必然会有一个将写好的程序翻译为CPU 识别的指令的过程,那么根据翻译的时机不同也可以分为两种类型语言。一种是翻译好再执行的叫编译型语言,编译型语言在执行前需要一个专门的编译过程,把程序源文件编译为机器语言的文件,运行时不需要重新编译,执行效率高,但缺点是,编译型语言依赖编译器,跨平台性差,如C、C++、Delphi、Pascal、Fortran等。另一种是边翻译边执行的叫解释型语言,解释型语言在运行时,需要逐行解释再运行,执行效率低,但跨平台性好,如Java、Basic、JavaScript、Python等。

        编程语言通常需要通过编译器或解释器将人类可读的源代码转换为计算机可执行的机器代码。编译器将源代码一次性地转换为机器代码,而解释器则逐行解释并执行源代码。

        编程语言为开发人员提供了许多强大的工具和功能,使他们能够创建各种类型的软件和应用程序,包括操作系统、移动应用程序、网站、游戏等。掌握编程语言是计算机科学和软件开发的关键技能之一。

2.1汇编语言

        为了克服机器语言的缺点,在科研人员的研究工作中很快就发明和产生了比较易于阅读和理解的汇编语言。
        所谓汇编语言,就是采用英文字母、符号来表示指令操作码、寄存器、数据和存储地址等,并在程序中用它们代替二进制编码数,这样编写出来的程序就称为符号语言程序或汇编语言程序。大多数情况下,一条汇编指令对应一条机器指令,少数对应几条机器指令。

汇编语言是一种低级机器语言的表示形式,它使用助记符(mnemonic)来代表机器指令,以提供对底层硬件的直接控制和访问。

        与高级编程语言相比,汇编语言更贴近计算机硬件的操作方式。它使用符号来代表机器指令的操作码和操作数,每个符号通常与一条特定的机器指令或硬件操作关联。

        汇编语言与不同的计算机体系结构和硬件平台密切相关,因为不同的计算机体系结构有不同的指令集。每种体系结构都有其自己的汇编语言和指令集。

        使用汇编语言编程需要开发人员直接操作寄存器、内存和其他底层硬件资源,以实现特定的任务和操作。它具有更高的操作精度和更低的级别,但需要更多的代码和更深入的了解底层硬件体系结构。

        汇编语言编写的程序需要通过汇编器将源代码转换为机器指令,以便计算机能够理解和执行。由于汇编语言指令直接映射到底层机器指令,因此它通常比高级编程语言更高效,并具有更严格的控制和性能优化能力。

        尽管汇编语言提供了对底层硬件的直接控制,但由于其复杂性和难以理解性,以及对底层硬件依赖性的限制,它在实际应用中的使用相对较少,通常只在特定的场景中使用,如驱动程序开发、嵌入式系统等。

        汇编语言的抽象层次很低,与机器语言一样,是与具体的机器密切相关的。针对某一种机器编写出来的程序,不能在其它机器上执行。即可移植性较差。因此用汇编语言编写程序仍然相当麻烦。尽管如此,从机器语言到汇编语言,仍然是前进了一大步。这意味着人与计算机的硬件系统不必非得使用同一种语言。程序员可以使用较适合人类思维习惯的语言。随着计算机程序设计技术的发展而出现的高级语言可以避免汇编语言的这些缺点。

2.2高级语言 

        由于汇编语言依赖于具体的 CPU 体系,且助记符量大难记,于是人们又发明了更加易用的所谓高级语言。高级编程语言是一种与人类语言相似且更易理解的编程语言,被设计用于编写计算机程序。相比于低级语言(如汇编语言),高级编程语言更加抽象和易于学习和使用。

        高级编程语言通过使用更接近人类语言的语法和结构,使开发人员能够更容易地表达逻辑和算法,并更高效地编写代码。高级编程语言隐藏了底层硬件细节,提供了更高级别的抽象,如变量、函数、类、条件语句、循环、数据结构等,以便开发人员能够更专注于解决问题和实现功能。它使用一般人易于接受的文字来表示(如英文或其他符号),从而使程序编写人员编写更容易,并且具有较高的可读性。

        高级编程语言的设计目的是提高开发效率、代码可读性和可维护性。它们通常具有比机器指令和低级语言更丰富的语法和语义,使得代码更易于理解和修改。

        高级编程语言还提供了许多工具和功能,如自动内存管理、异常处理、模块化编程、面向对象编程、图形用户界面等,使开发人员能够更轻松地开发复杂的软件系统。

        常见的高级编程语言包括C、C++、Java、Python、JavaScript、Ruby、PHP等。每种语言都有其自己的语法、语义和编程范式,以适应不同类型的应用和问题领域。

        使用高级编程语言编写的代码需要通过编译器或解释器将代码转换为底层的机器指令,以便计算机能够理解和执行。高级编程语言的优势在于提供了更高的开发效率和代码的可读性,但有时可能会以一定的性能代价。

四、数据概念

1、进制数

        不同进制本质上没有区别,都可以表示任意的数字。

十进制数:0,1,2,3,4,5,6,7,8,9。

二进制数:0,1。

八进制数:0,1,2,3,4,5,6,7。

十六进制数:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。

1.1二进制

逢2进1。
每一位都是2的整数次幂(基数是2)
表示符号:“B”。
例:1001.11B=1*2^3+0*2^2+0*2^1+1*2^0+1*2^(-1)+1*2^(-2)。

1.2八进制

表示方式:(0,1,3,4、5,6,7)
低位与高位的关系: 逢8进1。
每一位都是8的整数次幂(基数是8)。
表示符号:"O"。
例:375.20=3*8^2+7*8^1+5*8^0+2*8^(-1)

1.3十进制

十进制的表示方式为(0,1,2,3,4,5,6,7,8,9)
低位与高位的关系:逢10进1。
每一位都是10的整数次幂(基数是10)
表示符号:”D”
例:182.16D=1*10^2+8*10^1+2*10^0+1*10^(-1)+6*10^(-2)

1.4十六进制

表示方式:(0,1,3,4、5、6,7,8,9,A,B,C,D,E,F)
低位与高位的关系:逢16 进1。
每一位都是是16 的整数次幂(基数是16)。
表示符号:“H”。
例: 5F2.4H=5*16^2+15*16^1+2*16^0+4*16^(-1)

2.进制转换

2.1十进制转二进制

将十进制转换为二进制的方法是使用“除2取余法”。具体步骤如下:

  1. 将十进制数除以2,得到商和余数(例如,对于20,商为10,余数为0)。
  2. 去掉商中的整数部分,然后将余数作为二进制数的最低位(最右边)。
  3. 将上一步得到的商再次除以2,又得到一个商和余数(对于10来说,商为5,余数为0)。
  4. 将这个余数作为二进制数的次低位。
  5. 重复上述步骤,直到商为0为止。

例如,将十进制的20转换为二进制的过程如下:

20/ 2= 10 余0

10/ 2= 5 余0

5/ 2= 2 余1

2/ 2= 1 余0

1/ 2= 0 余1

因此,20的二进制表示为10100。

2.2八进制,十六进制和二进制的转换

        十进制虽然我们人类使用的很习惯,但是和二进制之间的转换极其麻烦。这也是八进制和十六进制会脱颖而出的原因。因为八进制和十六进制对于与二进制之间的相互转换极其方便。八进制(Octal)和十六进制(Hexadecimal)与二进制之间的转换可以通过以下方式进行:

  1. 二进制到八进制:
    将二进制数每三位数分开,然后分别转换为八进制数。例如,二进制数110101可以转换为八进制数155。
  2. 二进制到十六进制:
    将二进制数每四位数分开,然后分别转换为十六进制数。例如,二进制数110101可以转换为十六进制数45。
  3. 八进制到二进制:
    将八进制数每三位数分开,然后分别转换为二进制数。例如,八进制数170可以转换为二进制数1010100。
  4. 十六进制到二进制:
    将十六进制数每四位数分开,然后分别转换为二进制数。例如,十六进制数A5可以转换为二进制数10100101。

这些转换的基础是每种进制之间的特定关系:

  • 二进制、八进制和十六进制都是基于2的幂的系统,其中二进制是基数为2,八进制是基数为8,十六进制是基数为16。
  • 在二进制中,每个数字代表了2的某个幂次方;在八进制中,每个数字代表了8的某个幂次方;在十六进制中,每个数字代表了16的某个幂次方。
  • 在进行转换时,需要了解每种进制之间的转换规则,例如在二进制到八进制的转换中,需要知道八进制中的数字(0-7)如何对应二进制中的数字(0和1)。

        十进制可以缩短位数,但转换起来不方便。使用八进制和十六进制之后,可以缩短位数,同时容易转换。
        八进制:可以用一个八进制位代表三个二进制位
        十六进制:可以用一个十六进制位代表四个二进制位

3.计算机中的数据单位

位(bit):它是计算机中最小的数据单位,每一位的状态为1或者0。


字节(Byte):它是计算机中的基本的计量单位,一个字节可以存储一个英文字母,或者半个汉字(UTF-8中一个中文字符占3字节),一般情况,1字节=8位。


字(word):它是计算机中进行数据处理和运算的单元,一次存取、加工和传送的数据长度称为字。一个字通常由一个或多个(一般是字节的整数位)字节构成。

字长是 CPU的主要技术指标之一,指的是 CPU一次最大能并行处理的二进制位数。我经常接触到 byte 这个概念,它与位是不同的。


byte 表示字节,一个字节是 8 位,
word 是两个字节,也就是 16 位,
dword 是四个字节,也就是是 32 位。

然而我们常见的内存大小单位大写B是字节的意思,比如有:

B:字节(Byte)。
KB:千字节,1KB等于1024个字节。
MB:兆字节,1MB等于1024个KB。
GB:千兆字节,1GB等于1024个MB。
TB:万亿字节,1TB等于1024个GB。

4.计算机中的原码反码补码

        原码、反码和补码是计算机中用于表示数值的三种常见方式。

4.1原码

        原码是计算机中最直接的表示方式,它直接将数值的二进制形式作为机器码进行存储和运算。在原码表示中,正数的符号位为0,负数的符号位为1。数值部分与该数的绝对值相同。例如,+7和-7在8位原码系统中表示为:+7 = 00000111和-7 = 10000111。

        用途:原码是最直观的表示方式,但它最大的问题是在进行加减运算时需要处理符号位,这会增加运算的复杂度。因此,在实际的计算机系统中,通常会使用反码或补码来表示数值。

4.2反码

        反码是原码的一种变形,它对于正数和负数的表示方式相同,都是将原码的符号位不变,数值部分按位取反(即0变为1,1变为0)。例如,+7和-7在8位反码系统中表示为:+7 = 00000111和-7 = 11111000。

        用途:反码在加减运算时可以避免处理符号位,只需要对数值部分进行操作。但需要注意的是,使用反码进行减法运算时会出现负零的情况,这可能导致一些问题。

4.3补码

        补码是反码的一种改进形式,它对于正数和负数的表示方式相同,都是将原码的符号位不变,数值部分按位取反并加1。例如,+7和-7在8位补码系统中表示为:+7 = 00000111和-7 = 11111001。

        用途:补码解决了反码中负零的问题,使得加减运算更加统一。在计算机中,所有的数值都以补码的形式进行存储和运算。补码的另一个优点是它可以表示的范围更大,且能够完全对应到实际数值的绝对值。因此,补码在计算机科学和工程领域得到了广泛的应用。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮7号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值