计算最大内存大小时,2^n 中的“2”来自哪里?n=n 位

计算最大内存大小时,2^n 中的“2”来自哪里?n=n 位

因此,我阅读了有关地址总线和最大内存大小的资料,所以我的问题是,当计算任何架构的最大内存大小时,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 岁那样解释”类型的答案。

单个位有两种状态:01。使用单个位我可以存储两个值:

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 艺术,这里有一个图形版本:

原始的四个值(每个值 2 个字节)被复制,每行一个。然后,在第一组四个值之前添加一个 0,在第二组四个值之前添加一个 1。

如果对于前置的“位”(“trit”?),我们有三种可能的状态,假设ABC,那么可能的值的数量就会增加三倍:

 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

与上一张图片类似的图像,但现在有原始四个值的三个副本。前四个值前面附加有状态“A”,接下来四个值前面附加有状态“B”,最后四个值前面附加有状态“C”。

因此,向值添加一个新位会将可能值的数量乘以该新位可以具有的状态数。第一位有 2 个状态(01),因此 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 位机器,您可以寻址比您可以提供的多得多的内存,但是长期以来地址空间是一个真正的限制因素。

虽然这在某些地方过于简单化,但我希望它能给出正确的总体思路。

相关内容