我开发了一个基于 Beancount 的账本托管服务 HostedBeans,欢迎大家来了解纯文本复式记账并试用我的服务。

C++ 讲稿 3.计算机如何储存数据

By 精英王子

CC-BY-NC-SA(署名-非商业性使用-以相同方式共享) 3.0

注:解说在图片下方

原始幻灯片(持续更新):https://docs.google.com/presentation/d/1-9F3hQxXXlFk_ftLbh5C1gKnKcw–tnODPcD40TEg7g/edit

解说写在讲者备注

1

左下角,我们平时能够看到每个文件都有一个数字来表示他们的体积,数字后面还有各种不同的单位。

这节课我们就来了解计算机如何储存数据,这一节并不限于C++,所有的计算机、编程语言都是这么做的。

2

位是表示数据最基础的单位,他就像一个开关,只能表示两种状态之一,计算机很喜欢这种表示方法。

一个位只能表示两种状态之一,但通过将多个位组合在一起,即可表示更多种状态之一。

计算机通过将多个位(通常是几百万、上千万)通过一定结构,组合在一起,来表示数据。因此计算机以二进制为基础。

3

二进制数有很多特殊的性质,例如0.1在十进制中是有限小数,而在二进制中是无限小数。

十六进制数保留有二进制数的性质(因为十六是二的整数次幂),而且表示起来比二进制简短,所以有时我们也使用十六进制。

为了不至于把二进制、十进制、十六进制搞混,我们在书写的时候通常会在二进制数后加B作为后缀,在十六进制数前加0x作为前缀,十进制数原样书写。

或者用下标来表示进制。

4

所谓浮点数就是说小数点的位置是可以改变的,通过修改指数的大小,即可改变小数点的位置。

通过科学计数法,一个小数被划分为三个部分,它们都是整数,所以我们可以按照之前提到的储存整数的方法进行储存。

5

6

通过前面的介绍,可以得出这样的结论,计算机本质上储存的是数字,二进制数字。

所以如果想让计算机储存文字,必须指定一种从数字的字符的转换方法。

在ASCII中,每个字符对应一个二进制数字,通过储存这些数字即可表示这些字符。

特殊字符即各种无法直接显示在屏幕上的字符,如回车、换行等。

7

GB18030收录了7万多个汉字,自然无法用一个字节表示 (一个字节只能表示255个字符之一),所以我们需要用多个字节来表示一个汉字,所以GB18030属于多字节字符集。

同一个数字,在不同的字符集里面可能会表示不同的字符,将一个本来是GB18030(中文)编码的文件以日文字符集打开,就会看到日文字符,但这并不是翻译,而是乱码。

在一个使用GB18030(中文)编码的文件中,你无法插入日文字符,因为GB18030是中文字符集,其中没有日文字符。

为了解决这种混乱,成立一个叫Unicode的项目,他们指定了一组字符集,收录了世界上所有文字的字符。其中包括比较常用的UTF-8字符集。

8

我们时常在单位的前面加上一个前缀(“国际单位制词头”)来对单位放大或缩小一定的倍数。

对计算机中的字节也是一样,我们用1kB表示1000B,用1MB表示1000KB.

发现问题了么?你一定听说过计算机使用2的10次方——1024来进行进位。但是物理学早就规定k表示1000倍,

于是,大家又创建了一组新的词头:Ki、Mi、Gi等,他们以1024来进位而不是1000.

9

在大多数情况下,KiB、MiB中的i会被省略,甚至大多数人都不知道还有个i,有些软件也直接省略了i,但也有一些软件将i完整地写了出来。

10

11

理想

今天我们班开了一个“花有重开日,人无再少年”的班会,主题也就是梦想、理想。我觉得梦想和理想这两个词还是有区别的,前者更倾向于无法实现、不受自己控制的;而后者倾向于可以通过努力达到的。

似乎在班主任、班会的组织者、来我们班的实习老师、大多数同学的眼中,理想一定是要去上某个大学,而之后,就没有了。

实习老师讲他如何刻苦学习,如何拿到了众多奖项;幻灯片上提到了最近新闻中的“清华学霸”,还展示了她们的日程表。我承认他们都是优秀的,但是一定要要求每个人都这样做么?

主持人请我们班一直以来成绩排名第一的龙哥来谈谈自己的理想,龙哥说“希望有个健康的好身体、好好活着,身体是‘革命’的本钱”,大家都笑了。虽然这其中有玩笑的成分,但“有个健康的身体”、“好好活着”就不能是一个人的理想么?如果这话不是班级成绩第一,而是成绩靠后的同学说出来的,还会仅仅是善意的笑么?

再或者,有些人喜欢钱,即使已是富翁,还是爱钱,但他们一定是庸俗的么?可能赚更多的钱是他们的理想,更多的钱可能只是符号,但那是个人能力的象征。

什么时候连“你的理想是什么?”都有了标准答案,你当这是流水线么。有人这样说:在教育的流水线上,我是一个残次品,但我庆幸,我是那个残次品。

再说我自己,上不上大学,我还没有决定,但这并不重要。能取得怎样的成绩,取决于人,而不是上不上大学。不上大学不等于停止学习,恰相反,那些抱着“上了大学就可以随便玩了”的家长和同学才是失败者。

毫无疑问,我对计算机/互联网方面兴趣很大,也投入了很多努力。IT界瞬息万变,我也无法预测几年后的前沿技术是什么。我希望我在经过几年的经验积累之后,能够自己开发(而不是给别人打工)出一款产品,能够有人用,有人关注,越多越好。钱不是我关注的,有人用户、有人关注,自然会有钱。

短期内,我希望在我高中毕业前完成“零毫秒”——一个去中心化的网络。

物以类聚,人以群分。劝我按部就班读大学的,身边一定都是普普通通,上学、工作的朋友;若我今后奋斗成功,我的身边也一定是自己奋斗、喜欢冒险的人;若我失败,身边也一定都是失败者。

没人能预见未来,按自己的想法奋斗而失败,和听从别人劝告违背自己意愿而失败,我觉得前者会让我更好受一些 …

如果我的理想既不违反法律,又不违背社会的道德约定。那么老师是不是应该给我点支持,或者至少不是阻碍。(假设)家长不支持我可以理解,因为这关乎我的未来和他们的未来。但与老师那一点业绩相对的,是我的一生。

C++ 讲稿 2.HelloWorld

By 精英王子

CC-BY-NC-SA(署名-非商业性使用-以相同方式共享) 3.0

注:解说在图片下方

原始幻灯片(持续更新):https://docs.google.com/presentation/d/1BOk1KOHcI6Ts345Ja5vAyhSXhHRBRc53FNPnfr1p7fQ/edit

解说写在讲者备注

1

有同学表示上节课太浮云,没啥实际的。

我想说,我讲的都是我认为各位有必要了解的,如果你打算学C++,请端正态度,这里没有哪些是不重要的。

我已经把“预备知识”精简得很少了,其实我可以光讲“预备知识”而十节课不重样。

那么,这节课来点实际的!

2

这个程序的功能是输出一行字“Hello World!”,我们先要了解的是C++的输出功能。

C++提供了一个名叫iostream(input output stream)的组件,这个组件用来控制C++程序的输入和输出。

3

C++的输入和输出是基于一种“流”的概念,这是一个很有趣的概念。

试想,数据(在这里是“Hello World!”这一行字)就好像水流,屏幕就像一根水管。数据从计算机中,由屏幕这个水管流出来。
在你用键盘输入字符时,字符通过键盘流入计算机。

水管的特点就是可以任意组装,(通过后续的学习)你可以轻松地把本来指向屏幕的数据流,接到打印机上打印出来;或者接到文件上,写入到文件;再或者接到网络上,由网络发送数据流。

下面介绍这个(<<)符号,它由两个左尖括号组成,它在这里叫“流插入运算符”.

顺便提一下,C++中每个符号都有多种含义,不同的上下文的情况下,含义和功能不同。

流插入运算符就像一个箭头一样,在这里,它把右边的“Hello World!”插入到了cout中。cout表示标准输出(stdout)(standard output),默认是显示器,从而把“Hello World!”显示在屏幕上。

在C++,以及其他很多编程语言中,文字(Hello World!)必须由双引号括起来,因为计算机(编译器)不知道你是想在屏幕上显示“Hello World!”,还是发出一个叫Hello World!的指令。

“Hello World!”之后还有一个endl(end line),它是一个控制符,姑且我们可以认为它表示一个换行。

4

但事实上,cout和endl并不是C++语法的一部分,C++只提供的最为基础的语法,甚至不包括输入/输出、读写文件、绘制图形、网络操作、复杂的数学运算。在C++标准制定之前,这都需要程序员自己来完成。

为提高开发效率,标准中要求各编译器附带一个“标准库”,来提供上述部分功能。我们这套课程也会介绍标准库中一些功能的使用。标准库可以说是对C++各种语法的最佳实践。

即使编译器中附带了标准库,但如果你没有明确要求使用它,它也绝对不会出现。

开头的#include 表示把iostream这个标准库文件包含进来,这个组件之前介绍过了,用于提供输入输出的功能。

cout就依赖于iostream.

标准库中包含了很多的东西,为了防止你自己编写的代码与标准库发生冲突(如重名),标准库中的东西会被加上std::的前缀。cout事实上应该写成std::cout.

5

就像这样

6

但是对于我们这个不足十行的小程序来说,这么写只会带来麻烦而不是优势。所以我们可以加上这样一句(using namespace std;)代码来省略std::.

这行最后是一个分号,在C++中用分号表示一个语句的结束,而不是通过换行。事实上,C++编译器会忽略所有多余的换行和空格。这可以使人们自由地排版,让代码更容易阅读。

7

不过不建议大家使用过于反人类的排版方式。

8

现在我们已经将这个程序最核心的语句(cout<<&#8220;Hello World!&#8221;<<endl;)介绍完了,这行代码就能完成程序的主要功能,那么剩下几行是干什么的呢?

一个程序可能会有成千上万行代码,复杂的项目,如一个游戏,可能有几十万行代码。那么代码是从哪一行开始运行的呢?

并非想当然地是从头开始,而是从一个叫main(不是MAIN ,也不是mAin,更不是mian)的函数开始执行。这是一个约定俗成的习惯。

函数(function)是编程中一个常见的概念,它和数学上的函数概念有所不同,但也有一些相似,不过即使你对数学中的函数一窍不通,也不会影响你接下来的学习。

函数是程序的重要组成部分,一个程序可以由若干的函数组成,也可以只有一个——main函数。

函数包括了若干条以分号结尾的语句,一个函数被执行时,其中的语句会按照顺序逐个执行。

main函数是一个特殊的函数,它会在程序被打开时,(由操作系统调用)自动开始执行,是整个程序的入口点。

int main() 这是函数头,就像一个函数的自我介绍,一开始的int是“返回值类型”,在这里是int (Integer,整数).

然后是函数的名字,这里是main,最后括号中的是参数列表,在这里是空的。

对上述术语不懂没关系,今后我会细致讲解。

接下来就是main函数的内容,我们称之为函数定义,函数定义可能包含很多行语句,所以我们要用花括号将它们括起来。

一对花括号,以及其中的内容,在C++中表示一个“块”,是一个整体。在这里,这个块就是main函数的函数定义。

还有一句(return 0;),这表示中断(退出)这个函数(main函数)的执行,并提供返回值0给调用者,关于返回值,我们会在讲函数时详细讲。

至此,我们已经介绍完了Hello World这个程序。

9

为了帮助你自己或别人理解你的代码,你可以在代码中加入注释

C++中的注释有两种,一种是以两个斜杠开始,直到这一行结束。

还有一种以一个斜杠和一个星号开始,直到一个星号和一个斜杠,可以跨越多行。

编译器会无视你的注释,应该说注释是写给将来阅读代码的人看的。从某种程度上说,代码也是写给人看的,而不是计算机。

因为计算机只能理解二进制的指令。

10

这是上节课提到的另一个程序,这个程序会从键盘读取连个数字,计算这两个数字的和并输出。

我再介绍一下在命令行上输入数据:输入两个数字,中间以空格隔开,然后按回车,或者每输入一个数字按一次回车。

这个程序和刚才的Hello World差不多。相同的部分不再介绍。

double a,b; 这句的意思是定义两个double类型的变量,分别命名为a和b.

变量(Variable),就是可以在运行时改变的量,是处理数据的基础。

你可以随时把一个值存入变量,也可以随时读取它所存储的值。

变量所存储的值的类型,就是变量的类型。换句话说,变量的类型,决定了变量可以储存什么样类型的值。

这里的类型,可以是整数、浮点数(小数)、字符串(文字)等等.

这里的double表示浮点数,即小数,所以我们这个程序不光可以计算整数的和,还可以计算小数的和。

在定义变量之后就可以使用它了。

cin>>a>>b;

我们又看到了流插入运算符,但怎么是反的?

cin(char input)在这里表示标准输入,一般默认是来自键盘的。

这句代码的意思是让数据由键盘流至a、b这两个变量中。即从键盘读取两个数(小数,这取决与a和b的类型),分别存入a和b.

double c=a+b; 这次我们又定义了一个浮点型变量c,而且直接把它的值设置为a加b的和。

等号在这里叫赋值号,用来把右边的值复制到左边的变量中。而加号就是通常意义的相加。

这句代码其实是下面两句的缩写:

double c;

c=a+b;

cout<<a<<”+”<<b<<”=”<<c<<endl;

这一句看似复杂,但其实是我们学过的东西,

它会输出a+b=c,当然,a、b、c会用它们实际的值来替换。

可以看到,若要使用变量的值,直接写它的名字就可以,而要表示a这个字母,则要加双引号。

11

12

精子生于 1995 年,英文 ID jysperm.

订阅推送

通过 Telegram Channel 订阅我的博客日志、产品和项目的动态:

王子亭的博客 @ Telegram


通过邮件订阅订阅我的博客日志、产品和项目的动态(历史邮件):

该博客使用基于  Hexo  的  simpleblock  主题。博客内容使用  CC BY-NC-ND  授权发布。最后生成于 2025-02-10.