跳转至

C 学习笔记

第零章

0.1 信息在计算机中的表示

  • 用0和1表示各种信息

    • 逻辑门电路:开(高电位)对应1,关(低电位)对应0
    • 二进制:取值只能是0或1,一位称为一个“比特 (bit)”,简写作 b ;八位称为一个“字节 (byte)”,简写作 B
    • 8b = 1B, 1024B = 1KB, 还有 MB, GB, TB...
  • 0和1足以表示和传播各种信息

    • 文字编码:ASCII, UTF-8...
    • 图像编码:RGB
    • 音频编码:采样
    • ...

0.2 数制转换

进制只是数的表示形式,数本身没有进制之分。

0.2.1 K进制 \(\rightarrow\) (十)进制

设一个 \(n+1\) 位的 \(K\) 进制数为 $$\overline{A_n A_{n-1} A_{n-2} … A_2 A_1 A_0}, $$ 则其 大小 为 $$A_n×K^n + A_{n-1}×K^{n-1} +…+ A_0×K^0. $$ 转换成十进制即在相加的过程中使用十进制的进位规则

将十六进制数 AFD2 转换成十进制数。 AFD2 \( = 2 × 16^0 + 13 × 16^1 + 15 × 16^2 + 10 × 16^3 = 45010. \)

0.2.2 (十)进制 \(\rightarrow\) K进制 (长除取余法)

给定一个整数 \(N\)进制不重要)和进制 \(K\),那么 \(N\) 可以表示为

\[\begin{align*} N &= K^n×A_n + K^{n-1}×A_{n-1} +…+ K^1×A_1 + A_0 \\ &= K×(K^{n-1}×A_n + K^{n-2}×A_{n-1} +…+ K^0×A_1) + A_0. \\ \end{align*}\]

\(N\) 除以 \(K\) 的商为 \(K^{n-1}×A_n + K^{n-2}×A_{n-1} +…+ K^0×A_1\),余数为 \(A_0\);商再除以 \(K\) 的商为 \(K^{n-2}×A_n + K^{n-3}×A_{n-1} +…+ K^0×A_1\),余数为 \(A_1\) … 以此类推,直到商为0为止,就能依次求得 \(A_0、A_1…A_{n-1}、A_n\).

显然 \(A_i < K (i = 0,1,…,n)\). 得到的 \(K\) 进制数就是:$$A_n A_{n-1} A_{n-2} … A_2 A_1 A_0. $$

\(123\) 转换成二进制数。

\[123 = 2^6×1 + 2^5×1 + 2^4×0 + 2^3×1 + 2^2×1 + 2^1×1 + 2^0×1 = 1111011. \]

0.3 K进制小数

K进制小数 \(0.A_0 A_1 …A_n\) 的值是:$$A_0×K^{-1} + A_1×K^{-2} +…+ A_n×K^{-(n+1)}. $$

\((0.12)_{10} = 1 × 10^{-1} + 2 × 10^{-2}\)

\((0.1)_3 = 1 × 3^{-1}\) 表示成10进制就是无限循环小数

可见,\(n\) 进制下的有限位小数,在 \(m\) 进制下可能就是无限位小数,无法精确表示。 计算机用二进制表示小数,所以在计算机中,很多小数都是无法精确表示的,小数运算就有误差。