实践:进制、变量与存储
# 十进制与二进制
在我们的日常生活中,计数系统普遍采用的是十进制,这意味着每满10我们就进位到下一个数位,使用的数字范围是从0到9。0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...
然而,在计算机的世界里,情况有所不同。计算机使用的是二进制系统,它仅由两个数字组成:0和1,每当数值达到2时就会进位。0, 1, 10, 11, 100, 101, 110, 111, 1000
计算机之所以选择二进制,原因在于其与电子电路的工作原理相契合。在电路设计中,存在两种基本状态:通电(通常表示为1)和未通电(通常表示为0)。这种二元状态非常适合用来表示信息,因为它简化了电路的复杂性,使得设计更加直观和易于管理。因此,二进制成为了计算机处理和存储信息的理想选择。
当然计算机硬件也可能用电压是否超过阈值来表示0或1,这里就不深挖了。
# 数位分离(重要指数:⭐️⭐️⭐️⭐️⭐️)
数位分离是一种将数字的每一位独立提取出来的处理方式。这种方法在计算机科学、数学和其他领域中非常常见,尤其是在处理数字系统和算法时。下面我们通过一个简单的例子来说明这个过程。
以十进制数为例: 假设我们有一个十进制数 34829,我们想要分离出它的每一位数字。我们可以通过取余数(modulus)和整除(integer division)的方式来实现。
34829 % 10 = 9 (个位)
34829 / 10 = 3482 (去掉个位,得到新的数)
3482 % 10 = 2 (十位)
3482 / 10 = 348 (去掉十位,得到新的数)
348 % 10 = 8 (百位)
348 / 10 = 34 (去掉百位,得到新的数)
34 % 10 = 4 (千位)
34 / 10 = 3 (去掉千位,得到新的数)
3 % 10 = 3 (万位)
3 / 10 = 0 (此时原数已除尽,过程结束)
2
3
4
5
6
7
8
9
10
通过上述步骤,我们得到了 34829 的每一位数字:9, 2, 8, 4, 3
。注意:这些数字是按照从最低位到最高位的顺序排列的。这个过程可以一直重复,直到原数被除尽,变为0。
对于二进制数,数位分离的过程类似。以十进制数 11 为例,我们想要分离出每一位二进制位。由于二进制是基于2的,我们可以通过模2和整除2来操作。
11 % 2 = 1 (最低位,即1)
11 / 2 = 5 (去掉最低位,得到新的十进制数)
5 % 2 = 1 (次低位)
5 / 2 = 2 (继续去掉最低位,得到新的十进制数)
2 % 2 = 0 (次低位)
2 / 2 = 1 (继续去掉最低位,得到新的十进制数)
1 % 2 = 1 (次低位)
1 / 2 = 0 (此时原数已除尽,过程结束)
2
3
4
5
6
7
8
通过这个过程,我们得到了十进制数 11 在二进制表示中的每一位:1, 1, 0, 1
。由于分离的过程是从低位到高位,所以 11 的二进制表示就是
# 计算机中的数据单位
bit是计算机中的最小数据单位,代表一个二进制位,即 0 或 1 。
# 换算关系
1 Byte = 8 bits
1 Kilobyte (KB) = 1,024 Bytes (2^10 Bytes)
1 Megabyte (MB) = 1,024 Kilobytes (2^20 Bytes)
1 Gigabyte (GB) = 1,024 Megabytes (2^30 Bytes)
1 Terabyte (TB) = 1,024 Gigabytes (2^40 Bytes)
2
3
4
5
只有B和b之间是8进位,后面都是
# 计算机中数的表示
想象一下,你有一排由八个小灯组成的数字显示板,每个小灯可以是亮(1)或灭(0)。这个显示板就像是计算机中的一个字节,由8个bit组成。现在,我们用这个显示板来表示数字。
# 表示0和正数
比如,我们要表示数字7。在二进制中,7是0000 0111
。我们现在有8位,那能表示的最大值是多少呢?1111 1111
,也就是0~255
。
# 负数如何表示呢
可以想到用最高位表示数正负(符号位)!那么-7的就可以表示成是1000 0111
。那现在我们能够表示的范围是什么呢?由于最高位被占用,当做符号位,只有后面7位表示数的大小。
所以绝对值最大为-127~127
。
存在两个问题
- 无法计算
-7表示为:
1000 0111
7表示为:0000 0111
我们做个加法:
1000 0111
+ 0000 0111
1000 1110 => -14
2
3
在当前的表示方法下,-7 + 7居然等于 -14,十分混乱。
- 0怎么表示
0000 0000
还是1000 0000
,都表示0吗,那就有点浪费了 你想,无符号数我们可以表示0~255
,256个数。考虑负数的情况下,只能表示-127~127
,一共是255个数。我们浪费了一种表示。
# 从计算逻辑来看
为了解决这个问题,我们可以使用二进制减法来寻找负数的表示方法,被减数不够时,借位。比如,我们要计算8 - 15。在二进制中,8是0000 1000
,而15是0000 1111
。
0000 1000
- 0000 1111
1111 1001
2
3
这样,我们可以得到1111 1001
(这是-7的表示方法)。这个表示方法就叫做补码表示了。