计算机中的信息

信息的本质

信息的本质是消除不确定性:我们抛掷一枚硬币,然后用手盖住,出现正面朝上和反面朝上的概率都是二分之一。当我们偷看了结果,确定了是正面还是反面朝上,也就获得了信息。在这个例子中,我们消除的不确定性是一个二分之一的概率。在 香农 划时代的论文 通信的数学原理 中,首次提出了信息是可量化的,以及如何量化信息。我们以 bit 为信息的度量单位,一个 bit 可以是 0 或者 1,我们每获得一个 bit 的信息,就会消除一个二分之一的不确定性。

小思考题:如果我们抛掷的是一个骰子呢,当我们确定了一次投掷结果,我们获得多少信息(用 bit 为单位衡量)?
我们都知道,骰子有 6 个面,分别刻有 1~6,我们有六分之一的概率得到其中任意一个面朝上。那么我们获得的信息应该是:$\log_2 6$。

信息计量单位

比特(bit):我们现在所使用的计算机都是二进制的电子计算机,每个 bit 非 0 即 1。之所以使用二进制是因为物理上容易实现,高电压或低电压

字节(byte):在计算机中为了方便的管理内存,我们以 8 个比特为一个单位,这个单位叫做字节。

在你购买宽带的时候,比如 100M 宽带,指的是 100Mb/s,换算成字节为单位的速度:$\frac{100Mb/s}{8}=12.5MB/s$。所以我们发现下载速度通常没有听起来那么夸张,因为下载的文件通常是以字节为单位的,而运营商口中的 100M 指的是以比特为单位的速度。

K、M、G:这三个是最常见的倍数单位,可以用来搭配 b(bit)或者 B(Byte)。它们都是词根的缩写,K 是 Kilo,表示$2^{10}$ ;M 是 Mega,表示$2^{20}$ ;G 是 Giga,表示$2^{30}$ 。

其实在一般的场合中,K 表示$10^3$,M 表示$10^6$,G 表示$10^9$。而我们看到上面都是以1024倍递增($2^{10}=1024$),是 1000 的近似。在你购买硬盘的时候,厂商却是使用 1000 这一套进率的。比如 100GB 的硬盘,其实际容量只有:$\frac{100\times1000^3}{1024^3}=93.13GB$。而内存则是用 1024 进率算的,1GB 的内存就是$2^{30}$个字节,因为采用地址总线寻址,寻址空间必须是$2^n$,否则就会造成内存浪费或者定位到一个不存在的内存。

T、P:这两个如果你是程序员的话会比较常见。T 是 Tera,$2^{40}$;P 是 Peta,$2^{50}$。

往上走还有几个单位,但几乎没机会碰到:
1EB(Exabyte 百亿亿字节 艾字节)=1024PB,
1ZB (Zettabyte 十万亿亿字节 泽字节)= 1024 EB,
1YB (Yottabyte 一亿亿亿字节 尧字节)= 1024 ZB,
1BB (Brontobyte 一千亿亿亿字节)= 1024 YB.

字符集

信息是 bit 位+上下文(这里的信息可以理解为:人能读懂的有意义的信息),比特位中的信息可以根据上下文被任意地解读。举个例子,这里有一个hello.c文件,文件内容如下:

1
2
3
4
5
6
#include <stdio.h>

int main()
{
printf("hello, world\n");
}

如果以 ASCII 编码 的话,每个字节的内容如下:

一份C程序的ASCII码表示.png

  • 文本文件:内容是文本,文本文件都会采用一种特定的编码方式
  • 二进制文件:除去文本文件,其他的都是二进制文件

如果你碰到过乱码问题,那么可以尝试了解一下:什么是字符集和编码

Windows 记事本的 bug(具体原因可以自己上网查):

  • 新建一个文本文件,输入“写”,保存之后再打开,乱码д
  • 新建一个文本文件,输入“联通”,保存之后再打开,乱码��ͨ

字节序

计算机的内存地址是按字节编号,比如 4GB 的内存,它的内存地址从 0 到$2^{30}$,这里有个问题就是多字节的数据如何确定存放顺序。有的计算机采用 大端 有的则采用 小端

假设我有一个 int 型数(4 字节):0x29 16 10 57

29 是高位,57 是低位,如果高位存放的内存地址也是高地址,那么我们就称之为 大端 字节序。反之就是 小端 字节序。