11

This is most probably the dumbest question anyone would ask, but regardless I hope I will find a clear answer for this.

My question is - How is an integer stored in computer memory?

In c# an integer is of size 32 bit. MSDN says we can store numbers from -2,147,483,648 to 2,147,483,647 inside an integer variable.

As per my understanding a bit can store only 2 values i.e 0 & 1. If I can store only 0 or 1 in a bit, how will I be able to store numbers 2 to 9 inside a bit?

More precisely, say I have this code int x = 5; How will this be represented in memory or in other words how is 5 converted into 0's and 1's, and what is the convention behind it?

4

4 回答 4

14

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

为了比较,想想一个不适合我们通常系统的数字。比如 14。我们没有 14 的符号,那么我们如何表示呢?很简单,我们只需将两个符号1和结合起来414以 10 为底的意思1*10^1 + 4*10^0

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

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

对于负整数,我们使用一种方便的表示形式,称为二元补码,它是补码(所有1s 翻转到0并且所有0s 翻转到1s)加上一个。

之所以如此方便,主要有两个原因:

  • 通过查看单个位(我们使用的最高有效位),我们可以立即知道一个数字是正数还是负数32

  • 它在数学上是正确的,因为x - y = x + -y使用常规加法的方式与您在小学时学习的方式相同。这意味着如果处理器已经有加法,则处理器不需要做任何特殊的事情来实现减法。他们可以简单地找到(回忆,翻转位并加一)的二进制补码,y然后添加xy使用他们已经拥有的加法电路,而不是使用特殊的减法电路。

于 2013-08-29T18:08:54.363 回答
11

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

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

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

所以五个将是 00000000000000000000000000000101,因为 5 = 1 x 2 0 + 0 x 2 1 + 1 x 2 2 + ...其余的都是零。

那是一个uint。整数的约定是:

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

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

于 2013-08-29T18:41:01.743 回答
3

二进制的工作方式如下(作为你的 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(除了负位之外的所有1),即2^30 + 2 ^29 + 2^28 +........ +2^1 + 2^0 或 2,147,483,647。

最低的是 1000000.........0,表示 -2^31 或 -2147483648。

于 2013-08-29T18:14:24.073 回答
1

这就是高级语言导致的!?哎呀!

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

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

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

于 2013-08-29T18:33:46.973 回答