欢迎来到数据类型世界!

你好!今天我们要深入探讨计算机科学的“原子”:数据类型 (Data Types)。就像煮饭前必须知道食材是液体还是固体一样,计算机如果不清楚正在处理什么类型的数据,就无法进行运算。

在本指南中,我们将探索计算机如何存储数字、文字和逻辑。如果有些二进制数学看起来像《黑客帝国》般深奥,别担心——我们会一步一步为你拆解!

1. 五大基础数据类型 (The "Big Five" Primitive Data Types)

基础数据类型 (Primitive data type) 是程序语言提供的基本构建组件。你可以把它们想象成不同形状的盒子,每个盒子只能存放特定类型的物品。

  • 整数 (Integer):没有小数部分的完整数字(例如:-5, 0, 42)。
  • 实数/浮点数 (Real / Floating Point):带有小数部分的数字(例如:3.14, -0.01)。
  • 字符 (Character):单一的字母、数字或符号(例如:'A', '!', '3')。
  • 字符串 (String):由多个字符组成的序列,通常用于单词或句子(例如:"Hello World")。
  • 布尔值 (Boolean):只有两个值:真 (True)假 (False)

小测验:如果你要存储某人的年龄,你会使用 整数 (Integer);如果你要存储他们的身高(米),则会使用 实数 (Real)

2. 正整数的表示法

计算机使用 二进制 (Binary, 基数 2),只使用 0 和 1。这是因为计算机硬件是由无数个微小的开关组成的,这些开关只有关闭 (0) 或开启 (1) 两种状态。

十进制转二进制

要将十进制数字转换为二进制,我们使用每位数递增的权重:128, 64, 32, 16, 8, 4, 2, 1

示例:将 13 转换为二进制。
1. 8 能放入 13 吗?可以。(13 - 8 = 5)。在 8 的位置下方放 1
2. 4 能放入 5 吗?可以。(5 - 4 = 1)。在 4 的位置下方放 1
3. 2 能放入 1 吗?不行。在 2 的位置下方放 0
4. 1 能放入 1 吗?可以。在 1 的位置下方放 1
结果:\(00001101\)

十六进制 (Hexadecimal, 基数 16)

二进制对人类来说很难阅读。十六进制是一种简写方式,使用 0-9 以及 A, B, C, D, E, F 来代表 10-15 的值。

为什么要用十六进制?一个十六进制数字刚好代表 4 个比特(一个 nibble)。记住 #FF0000 远比记住长长的一串 0 和 1 要容易得多!

3. 二进制中的负数

计算机如何知道一个数字是负数呢?我们主要有两种方法:

符号与数值法 (Sign and Magnitude)

这是最简单的方法。我们使用 最高有效位 (MSB)(即最左边的那一位)作为“标记”。
- 如果 MSB 是 0,该数字为 正数
- 如果 MSB 是 1,该数字为 负数

示例:如果 \(00001101\) 是 +13,那么 \(10001101\) 就是 -13。
问题:计算机以此方式运算很困难,而且会出现“负零”(\(10000000\)) 的状况,这会造成混乱!

二补数 (Two's Complement)

这是专业的处理方式。MSB 具有 负值。在 8 位元数字中,最左边的位元代表 -128 而非 +128。

“反转并加 1”技巧:
将 +5 变为 -5:
1. 先写出 +5: \(00000101\)
2. 反转所有位元 (NOT): \(11111010\)
3. 加 1: \(11111011\)
现在,如果你将这些值相加:\(-128 + 64 + 32 + 16 + 8 + 2 + 1 = -5\)。成功了!

4. 二进制算术

二进制加法就像普通加法一样,但只要加到 2 就需要“进位”。

加法规则:
  • \(0 + 0 = 0\)
  • \(0 + 1 = 1\)
  • \(1 + 1 = 0\) (进 1)
  • \(1 + 1 + 1 = 1\) (进 1)

常见错误:溢出 (Overflow)!
如果你将两个数字相加,结果需要 9 位元,但你只有一个 8 位元的“盒子”,多出来的位元就会丢失。这就是 溢出错误 (Overflow Error),它会导致程序崩溃或出现异常行为。

5. 浮点数 (小数)

在 A Level 计算机科学中,我们使用 尾数 (Mantissa)指数 (Exponent) 来表示小数。
想象成科学计数法:\(Mantissa \times 2^{Exponent}\)。

归一化 (Normalization)

为了确保数字拥有最大的精确度,并且只有一种表示方式,我们对其进行 归一化
- 归一化后的 正数 总是以 01 开头。
- 归一化后的 负数 总是以 10 开头。

类比: 归一化就像是规定必须写成 "1.23 x 10²" 而不是 "12.3 x 10¹" 或 "0.123 x 10³"。这样能保持数据整洁!

6. 位运算 (Bitwise Manipulation)

有时我们需要检查个别位元,这时会用到 逻辑掩码 (Logical Masks)

  • AND:用于 提取清除 位元。(两者皆为 1 时结果才为 1)。
  • OR:用于 设定 位元(强制变为 1)。(只要有一个为 1 时结果即为 1)。
  • XOR:用于 反转 位元。(两者不同时结果为 1)。

位移 (Bitwise Shifts)

- 逻辑左移 (Logical Shift Left):将位元向左移动,右侧补 0。效果:乘以 2。
- 逻辑右移 (Logical Shift Right):将位元向右移动。效果:除以 2(舍去余数)。

7. 字符集:ASCII 和 Unicode

计算机是如何将 \(01000001\) 变成字母 'A' 的呢?我们使用 字符集 (Character Set),这是一个对照表。

ASCII:
- 使用 7 或 8 个位元。
- 可表示 128 或 256 个字符。
- 对英文来说足够,但对其他语言则不足。

Unicode:
- 使用 16 或 32 个位元。
- 可表示数以百万计的字符。
- 涵盖所有语言、科学符号,甚至是 表情符号 (Emojis)! 🍕

关键总结: Unicode 是现代标准,因为它是全球通用的;而 ASCII 则非常受限。

总结清单

在继续学习之前,确保你能做到以下事项:
- [ ] 列出 5 种基础数据类型。
- [ ] 进行十进制、二进制和十六进制之间的转换。
- [ ] 解释为什么二补数比符号与数值法更好。
- [ ] 执行二进制加法并识别溢出。
- [ ] 描述尾数和指数的作用。
- [ ] 说明 ASCII 和 Unicode 的区别。

如果现在觉得浮点数运算有点困难,别担心。多练习画出位元权重表,很快就会变得很顺手了!你绝对没问题!