整数如何存储在内存中

本文关键字:内存 存储 何存储 整数 | 更新日期: 2023-09-27 18:29:29

这很可能是任何人会问的最愚蠢的问题,但无论如何,我希望我能找到一个明确的答案。

我的问题是 - 整数如何存储在计算机内存中?

在 c# 中,整数的大小为 32 位。MSDN 说我们可以在整数变量中存储从 -2,147,483,648 到 2,147,483,647 的数字。

根据我的理解,位只能存储2个值,即0和1。如果我只能在位中存储 0 或 1,那么我如何在位内存储数字 2 到 9?

更准确地说,假设我有这段代码int x = 5;这将如何在内存中表示,或者换句话说,如何将 5 转换为 0 和 1,它背后的约定是什么?

整数如何存储在内存中

它以二进制表示(基数 2(。阅读有关数字基数的更多信息。在基数 2 中,您只需要 2 个不同的符号来表示一个数字。我们通常使用符号 01 .在我们通常的基础中,我们使用10不同的符号来表示所有数字,012,... 89

为了进行比较,请考虑一个不适合我们通常系统的数字。像14。我们没有 14 的符号,那么我们如何表示它呢?很简单,我们只需将两个符号组合在一起 14 . 以 10 为基数的14表示1*10^1 + 4*10^0 .

基数 2(二进制(中的1110表示 1*2^3 + 1*2^2 + 1*2^1 + 0*2^0 = 8 + 4 + 2 + 0 = 14 。因此,尽管在任何一个基中都没有足够的符号来表示14单个符号,但我们仍然可以在两个基数中表示它。

在另一个常用的底数中,以 16 为底,也称为十六进制,我们有足够的符号来表示仅使用其中一个符号的14。您通常会看到使用十六进制符号e书写14

对于负整数,我们使用一种称为twos-补码的方便表示,它是补码(所有1 s翻转为0,所有0 s翻转为1 s(,并添加一个。

这如此方便有两个主要原因:

  • 我们通过查看单个位(我们使用的32中最重要的位(立即知道一个数字是正数还是负数。

  • 这在数学上是正确的,因为x - y = x + -y使用常规加法的方式与你在小学学到的方式相同。这意味着如果处理器已经有加法,则无需执行任何特殊操作即可实现减法。他们可以简单地找到y的二进制补码(召回,翻转位并加一个(,然后使用他们已经拥有的加法电路将xy相加,而不是使用特殊的减法电路。

这根本不是一个愚蠢的问题。

让我们从 uint 开始,因为它稍微容易一些。约定是:

  • 你在一个 uint 中有 32 位。每个位分配一个从 0 到 31 的数字。按照惯例,最右边的位是 0,最左边的位是 31。
  • 取每个位号并将 2 提高到该幂,然后将其乘以该位的值。因此,如果第三位是 1,那就是 1 x 23。 如果位 12 为零,则为 0 x 212
  • 把所有这些数字加起来。这就是价值。

所以 5 会00000000000000000000000000000101,因为 5 = 1 x 2 0 +0 x 21 + 1 x 22 + ...其余的都是零。

这是一个uint.整数的约定是:

  • 将值计算为uint
  • 如果该值大于或等于 0 且严格小于 231,则您就完成了。int 和 uint 值相同。
  • 否则,从 uint 值中减去 232,这就是 int 值。

这似乎是一个奇怪的惯例。我们使用它是因为事实证明,很容易构建以这种格式非常快速地执行算术的芯片。

二进制

的工作原理如下(作为您的 32 位(。

   1  1  1  1 | 1  1  1  1 | 1  1  1  1 | 1  1  1  1 | 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | 1 1 1 1
2^ 31 30 29 28  27 26 25 24  23 22 21 20  19 18 17 16......................................0
   x

x = 符号位(如果为 1,则为负数,如果为 0,则为正数(

所以最高的数字是 0111111111............1(除负位之外的所有数字(,即 2^30 + 2 ^29 + 2^28 +........+2^1 + 2^0 或 2,147,483,647。

最低值为 1000000.........0,表示 -2^31 或 -2147483648。

这就是高级语言的结果吗!?哎呀!

正如其他人所说,这是一个以 2 为基数的计数系统。人类大多是自然的 10 进制计数器,尽管由于某种原因时间是 60 进制,而 6 x 9 = 42 以 13 为基数。艾伦·图灵显然擅长以17为基数的心算。

计算机在基座 2 中运行,因为电子设备很容易打开或关闭 - 代表 1 和 0,这是基座 2 所需要的。你可以以这样一种方式构建电子设备,即它处于打开、关闭或介于两者之间。这将是 3 个州,允许您进行第三级数学(而不是二进制数学(。然而,可靠性降低了,因为很难区分这三种状态,而且电子设备要复杂得多。更高的级别会导致更差的可靠性。

尽管它是在多级单元闪存中完成的。在这些中,每个存储单元代表开、关和一些中间值。这提高了容量(每个单元可以存储几个位(,但对于可靠性来说,这是个坏消息。这种芯片用于固态驱动器,这些驱动器在完全不可靠的边缘运行,以最大限度地提高容量。