欢迎来到数据类型世界!
你好!今天我们要深入探讨计算机科学的“原子”:数据类型 (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)
二进制减法
要进行二进制数字减法(例如 \(A - B\)),计算机使用二补数将减数 (\(B\)) 转换为负数形式,然后将它们相加 (\(A + (-B)\))。任何超出固定位宽度的最终进位都会被舍弃。
常见错误:溢出 (Overflow)!
如果你将两个数字相加,结果需要 9 位,但你只有一个 8 位的“盒子”,多出来的位就会丢失。这就是 溢出错误 (Overflow Error),它会导致程序崩溃或出现异常行为。
5. 浮点数 (小数)
在 A Level 计算机科学中,我们使用 尾数 (Mantissa) 和 指数 (Exponent) 来表示小数。
想象成科学计数法:\(\text{Mantissa} \times 2^{\text{Exponent}}\)。
归一化 (Normalisation)
为了确保数字拥有最大的精确度,并且只有一种表示方式,我们对其进行 归一化。
- 归一化后的 正数 总是以 01 开头。
- 归一化后的 负数 总是以 10 开头。
类比: 归一化就像是规定必须写成 "1.23 x 10²" 而不是 "12.3 x 10¹" 或 "0.123 x 10³"。这样能保持数据整洁!
浮点数加法与减法
要对浮点数进行算术运算:
1. 对齐指数: 调整其中一个尾数(通过移位),直到两个数字拥有相同的指数。
2. 尾数相加或相减: 对对齐后的尾数进行二进制加法或二补数减法。
3. 重新归一化: 将计算所得的尾数移位,使其以 01(正数)或 10(负数)开头,并相应调整指数。
6. 位运算 (Bitwise Manipulation)
有时我们需要检查个别位,这时会用到 逻辑掩码 (Logical Masks)。
- AND:用于 提取 或 清除 位。(两者皆为 1 时结果才为 1)。
- OR:用于 设定 位(强制变为 1)。(只要有一个为 1 时结果即为 1)。
- XOR:用于 反转 位。(两者不同时结果为 1)。
逻辑移位与算术移位
- 逻辑左移 (Logical Shift Left):将位向左移动,空出的位置补 0。效果:乘以 2。
- 逻辑右移 (Logical Shift Right):将位向右移动,空出的位置补 0。效果:将无符号数除以 2。
- 算术右移 (Arithmetic Shift Right):将位向右移动,但通过将原本的 MSB 复制到最左边的位置来保留符号位 (MSB)。效果:将有符号二补数除以 2。
7. 字符集:ASCII 和 Unicode
计算机是如何将 \(01000001\) 变成字母 'A' 的呢?我们使用 字符集 (Character Set),这是一个对照表。
ASCII:
- 使用 7 或 8 个位。
- 可表示 128 或 256 个字符。
- 对英文来说足够,但对其他语言则不足。
Unicode:
- 使用 16 或 32 个位。
- 可表示数以百万计的字符。
- 涵盖所有语言、科学符号,甚至是 表情符号 (Emojis)! 🍕
关键总结: Unicode 是现代标准,因为它是全球通用的;而 ASCII 则非常受限。
总结清单
在继续学习之前,确保你能做到以下事项:
- [ ] 列出 5 种基础数据类型。
- [ ] 进行十进制、二进制和十六进制之间的转换。
- [ ] 解释为什么二补数比符号与数值法更好。
- [ ] 执行二进制加法、减法并识别溢出。
- [ ] 区分逻辑移位与算术移位。
- [ ] 描述尾数和指数的作用,并概述浮点数归一化。
- [ ] 说明 ASCII 和 Unicode 的区别。
如果现在觉得浮点数运算有点困难,别担心。多练习画出位权重表,很快就会变得很顺手了!你绝对没问题!