我刚读大二的时候开始自学计算机,因为我大学主修英语。那时候就听过一句话:“机器生汇编,汇编生C,C生万物”。这句话很形象的揭示了C语言在汇编语言和其他高级语言中的承上启下的关系。

对于大部分学习计算机的人来说,C语言是学习编程绕不开的第一门语言,很少有不了解C的程序员。C语言除了能让你更了解编程的相关概念,带你走进编程的大门外,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的,程序在内存中是一种怎样的状态,操作系统和用户程序之间有着怎样的“爱恨纠葛”等等等等。

这些底层知识决定了程序员的发展高度,也决定了计算机从业人员的职业生涯。

相对于其他高级语言(如Java,C )来说,C语言概念少,词汇少,只是包含了基本的编程元素,后来的很多语言(C 、Java等)都或多或少的参考了C语言。如果说C语言之前的机器语言是计算机程序世界的鸿蒙初开的话,汇编就是混沌初开后的一次“物种爆发”,那么C语言就是更高级“生命”孕育的基础。

可以毫不夸张的说,C语言改变了编程世界。也正是由于C语言相对简单的语法细节,因此对初学者来说,C语言的学习成本低,时间短,能够快速掌。

C语言好不好学?

和 Java、C 、Python、C#、JavaScript 等高级编程语言相比,C语言涉及到的编程概念少,附带的标准库小,整体比较简洁,非常适合初学者入门。

进制

我们平时使用的阿拉伯数字都是由 0~9 共十个数字组成的,例如 1、34、10、598、367 等。一个数字最多能表示九,如果要表示10、11、29、900等就需要多个数字组合起来。

例如表示 9 9 的结果,一个数字肯定不够,只能靠”进位“来满足,用 18 来表示;这时”进一位“相当于十,”进两位“相当于二十。

因为逢十进一,也因为只有 0~9 共十个数字,所以叫做十进制(Decimalism)。十进制是在人类社会发展过程中自然形成的,它符合人们的思维习惯。

进制也就是进位制。进行加法运算时逢X进一(满X进一),进行减法运算时借一当X,这就是X进制,这种进制也就包含X个数字,基数为X。十进制有 0~9 共10个数字,基数为10,在加减法运算中,逢十进一,借一当十。

而在计算机内部,晶体管的构成是不支持十进制的,计算机要处理的信息的格式是多种多样的,有数字、文字、图形、音频、视频等,这些信息在人们的眼里是不同的。但对于计算机来说,它们在内存中都是一样的,都是以二进制的形式来表示。

要学习计算机就必须了解二进制,它是计算机世界的基础。

内存是一个非常牛逼的部件,它内部包含了成万上亿个晶体管,它们很小,小到纳米级别。这些晶体管实际上就是一个个的电路。高中物理我们学过,只要是电路,并且接通了电源,那么电路就会有电压变化,普通电路的电压变化范围很大,但是晶体管所表示的电路的电压范围却很固定:要么是 0V,要么是 5V,只有这两种电压。5V 表示通电,用1表示,0V 表示断电,用0表示。

零基础趣学c语言(C语言入门)(1)

每一个晶体管就是一个电路

所以,一个晶体管有2种状态,0 或者 1。

既然每一个晶体管就是一个电路,那么我们就可以通过特殊的电路来控制这些元器件的通断电,这样就会得到很多0、1的组合。例如,8个晶体管有 2的8次方即256 种不同的组合,16个晶体管有 2的16次方65536 种不同的组合。虽然一个晶体管只能表示2个数值(0和1),但是多个晶体管组合起来就可以表示很多数值了。

例如:

二进制1010表示1×2³+0×2² 1×2¹+0×2º=8 2=10;

二进制1111表示1×2³+1×2²+1×2¹+1×2º=15;

以此类推。

这样,不同的晶体管的数量就可以表示海量的二进制数了(除了二进制还有八进制,十六进制数等)。除了可以表示数字,我们也可以使用不同进制的数的组合表示非数字。

例如使用二进制1101000就可以表示大写的英文"C",用二进制00000000表示中文“中”字。

零基础趣学c语言(C语言入门)(2)

进制对照表

既然计算机是以二进制的形式来存储数据的,它只认识 0 和 1 两个数字,那么我们在屏幕上看到的文字,图片,视频,音频是如何存储和表示的?其实它们在存储之前都被转换成了二进制(0和1序列),在显示时也要根据二进制找到对应的字符(像素也行)。

也就是说特定的文字(图片,视频)对应着固定的二进制。那么,计算机是怎样将文字与二进制对应起来呢?这就需要有一套规范,计算机公司和软件开发者都必须遵守,这样的一套规范就称为字符集(Character Set)或者字符编码(Character Encoding)。

下一篇更精彩,将讲解ASCII码。

,