![计算最大内存大小时,2^n 中的“2”来自哪里?n=n 位](https://linux22.com/image/1626863/%E8%AE%A1%E7%AE%97%E6%9C%80%E5%A4%A7%E5%86%85%E5%AD%98%E5%A4%A7%E5%B0%8F%E6%97%B6%EF%BC%8C2%5En%20%E4%B8%AD%E7%9A%84%E2%80%9C2%E2%80%9D%E6%9D%A5%E8%87%AA%E5%93%AA%E9%87%8C%EF%BC%9Fn%3Dn%20%E4%BD%8D.png)
因此,我阅读了有关地址总线和最大内存大小的资料,所以我的问题是,当计算任何架构的最大内存大小时,2^n 中的 2(其中 n 是地址总线位大小)从何而来?此外,“位大小”到底是什么意思?我非常困惑。
答案1
2 源自二进制数的性质,每个数字恰好有 2 种可能的状态。
当计算给定数字可以包含的值的数量时,计算总是Options^Instances
。选项表示数字可能具有的一组选择,并且实例表示正在使用的数字(长度、宽度和大小是常见的同义词)。
同样,要计算可以存储的值的范围,它是0 -> (Options^Instances) - 1
。
请注意,数字值始终自然数,所以我们不必担心负数或小数或任何更奇特的东西。这些概念建立在数字值之上以增强其含义,但底层值表示保持不变。3、-3 和 3.3 都表达了不同的含义,但它们都以相同的方式和相同的规则使用数字值 3。
因此,一个 2 位数可以表示 4 个可能的值,范围从 0 到 2^2-1(0-3)。也就是说,可能值的集合为{00, 01, 10, 11}
。
一位数字二进制包含 2 个选项,因此它是二进制。目前使用的最常见数字系统每个数字有 10 个选项(0-9),因此它们是十进制。其他常见进制包括八进制(8 进制)和十六进制(以 16 为基数)。
这个概念甚至不仅限于数字,而是任何精心设计的数值集合。如果我想计算由所有小写拉丁字母组成的可能的 8 个字符密码的数量,那么它将是 26^8。如果我添加大写字母,它将是 52^8。如果我再添加数字,它将是 62^8。但是对于二进制数,由于它只能是 0 或 1,所以它始终是 2^n。
位大小是指用于存储值(“实例”变量)的位数。举一个现实世界的例子,游戏《无人深空》使用 32 位数字来表示金钱,因此您获得的金钱永远不会超过 4,294,967,295。这是因为它是您可以用 32 位表示的最大值。
答案2
以下是尝试“像我 5 岁那样解释”类型的答案。
单个位有两种状态:0
和1
。使用单个位我可以存储两个值:
0
1
通过添加一位,我们可以存储四个值。我们先忽略它们是二进制数,只需记住它们是不同的值:
00
01
10
11
再添加一个,我们就有八个值:
000
001
010
011
100
101
110
111
为什么它们会加倍?想象一下,您将新位添加到左侧。如果该位为 0,您将获得前一组四个值,但前缀为 0。如果为 1,您将获得前一组四个值,前缀为 1。总共有 8 个:4 个先前的值乘以添加位的 2 个可能状态。
previous bits | previous bits
↓↓ | ↓↓
000 | 100
001 | 101
010 | 110
011 | 111
↑ | ↑
new '0' bit | new '1' bit
如果你不喜欢 ASCII 艺术,这里有一个图形版本:
如果对于前置的“位”(“trit”?),我们有三种可能的状态,假设A
,B
和C
,那么可能的值的数量就会增加三倍:
previous bits | previous bits | previous bits
↓↓ | ↓↓ | ↓↓
A00 | B00 | C00
A01 | B01 | C01
A10 | B10 | C10
A11 | B11 | C11
↑ | ↑ | ↑
new 'A' bit | new 'B' bit | new 'C' bit
因此,向值添加一个新位会将可能值的数量乘以该新位可以具有的状态数。第一位有 2 个状态(0
和1
),因此 1 位数有 2 个值。第二位有两种状态:
2 × 2 = 4
↑ ↑
↑ number of 2nd bit's states
↑
number of 1st bit's states
第三位也有两种状态:
4 × 2 = 8
↑ ↑
↑ number of 3rd bit's states
↑
number of previous values
与第四位相同:
8 × 2 = 16
↑ ↑
↑ number of 4th bit's states
↑
number of previous values
我们可以将此公式中的8展开为我们之前的计算结果:
((2 × 2) × 2) × 2 = 16
↑ ↑ ↑ ↑
↑ ↑ ↑ number of 4th bit's states
↑ ↑ ↑
↑ ↑ number of 3rd bit's states
↑ ↑
↑ number of 2nd bit's states
↑
number 1st bit's states
如您所见,要获得可能值的数量,您必须将特定位的状态数相乘。由于我们所有的位都有 2 个状态,因此我们可以将 2 的乘积简化n
为 2 n。
答案3
让我用一个类比来补充现有的答案:有多少个不同的数字(我们称之为地址) 你能用n
- 位数字构建吗?
咱们试试吧:
- 2位数字可以构建从00至99的地址,共100个地址。
- 3位数字可以构建从000至999的地址,共1000个地址。
- ...
- 一般来说,
n
数字可以构成10^n
地址。
这是因为一个(十进制)数字有 10 种可能的状态(0-9、拉丁十二月=十)。
位类似于数字,只是它们只有 2 个状态(0 和 1)。因此,n
位可以构建2^n
地址。
答案4
很多答案都在试图解释“二进制”方面的问题,但可能不清楚这与计算机架构有何关联。计算机以称为“字”的块形式处理位。在现代计算机中,一个字通常为 64 位,而长期以来,标准字长为 32 位。当您拥有整数或无符号整数数据类型时,您得到的就是一个字的位。如果您编写软件进行算术运算,则可以处理更大的数字,但这不是像单字整数类型那样内置在机器中的。
这很重要,因为每个内存位置都有一个地址,而地址只是一个数字。假设你正在使用一台 1980 年代的 16 位字机器。对于无符号整数,你可以表示 2^16 个不同的整数,因此这些就是你可以拥有的所有内存地址。这就像注意到美国和加拿大只能有 100 亿部电话,因为电话号码只有十位数字。(实际上更少,因为有效电话号码有限制。)
使用 64 位机器,您可以寻址比您可以提供的多得多的内存,但是长期以来地址空间是一个真正的限制因素。
虽然这在某些地方过于简单化,但我希望它能给出正确的总体思路。