精子生于 1995 年,英文 ID jysperm.
C++ 讲稿 3.计算机如何储存数据
By 精英王子
CC-BY-NC-SA(署名-非商业性使用-以相同方式共享) 3.0
注:解说在图片下方
原始幻灯片(持续更新):https://docs.google.com/presentation/d/1-9F3hQxXXlFk_ftLbh5C1gKnKcw–tnODPcD40TEg7g/edit
解说写在
讲者备注
中
左下角,我们平时能够看到每个文件都有一个数字来表示他们的体积,数字后面还有各种不同的单位。
这节课我们就来了解计算机如何储存数据,这一节并不限于C++,所有的计算机、编程语言都是这么做的。
位是表示数据最基础的单位,他就像一个开关,只能表示两种状态之一,计算机很喜欢这种表示方法。
一个位只能表示两种状态之一,但通过将多个位组合在一起,即可表示更多种状态之一。
计算机通过将多个位(通常是几百万、上千万)通过一定结构,组合在一起,来表示数据。因此计算机以二进制为基础。
二进制数有很多特殊的性质,例如0.1在十进制中是有限小数,而在二进制中是无限小数。
十六进制数保留有二进制数的性质(因为十六是二的整数次幂),而且表示起来比二进制简短,所以有时我们也使用十六进制。
为了不至于把二进制、十进制、十六进制搞混,我们在书写的时候通常会在二进制数后加B作为后缀,在十六进制数前加0x作为前缀,十进制数原样书写。
或者用下标来表示进制。
所谓浮点数就是说小数点的位置是可以改变的,通过修改指数的大小,即可改变小数点的位置。
通过科学计数法,一个小数被划分为三个部分,它们都是整数,所以我们可以按照之前提到的储存整数的方法进行储存。
通过前面的介绍,可以得出这样的结论,计算机本质上储存的是数字,二进制数字。
所以如果想让计算机储存文字,必须指定一种从数字的字符的转换方法。
在ASCII中,每个字符对应一个二进制数字,通过储存这些数字即可表示这些字符。
特殊字符即各种无法直接显示在屏幕上的字符,如回车、换行等。
GB18030收录了7万多个汉字,自然无法用一个字节表示 (一个字节只能表示255个字符之一),所以我们需要用多个字节来表示一个汉字,所以GB18030属于多字节字符集。
同一个数字,在不同的字符集里面可能会表示不同的字符,将一个本来是GB18030(中文)编码的文件以日文字符集打开,就会看到日文字符,但这并不是翻译,而是乱码。
在一个使用GB18030(中文)编码的文件中,你无法插入日文字符,因为GB18030是中文字符集,其中没有日文字符。
为了解决这种混乱,成立一个叫Unicode的项目,他们指定了一组字符集,收录了世界上所有文字的字符。其中包括比较常用的UTF-8字符集。
我们时常在单位的前面加上一个前缀(“国际单位制词头”)来对单位放大或缩小一定的倍数。
对计算机中的字节也是一样,我们用1kB表示1000B,用1MB表示1000KB.
发现问题了么?你一定听说过计算机使用2的10次方——1024来进行进位。但是物理学早就规定k表示1000倍,
于是,大家又创建了一组新的词头:Ki、Mi、Gi等,他们以1024来进位而不是1000.
在大多数情况下,KiB、MiB中的i会被省略,甚至大多数人都不知道还有个i,有些软件也直接省略了i,但也有一些软件将i完整地写了出来。