整数是如何存储在内存中的?

时间:2013-08-29 18:04:19

标签: c# binary twos-complement

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

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

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

根据我的理解,一个位只能存储2个值,即0& 1.如果我只能存储0或1,我怎么能在2位内存储数字?

更确切地说,我说这段代码int x = 5;这将如何在内存中表示,或者换句话说如何将5转换为0和1,以及它背后的惯例是什么?

4 个答案:

答案 0 :(得分:13)

它以二进制(基数2)表示。 Read more about number bases。在基数2中,您只需要2个不同的符号来表示数字。我们通常使用符号01。在我们通常的基础中,我们使用10个不同的符号来表示所有数字,012,... 8和{{1 }}

为了进行比较,请考虑一个不适合我们常用系统的数字。像14.我们没有14的符号,所以我们如何表示它?很简单,我们只合并了两个符号91。基数10中的4表示14

基数2(二进制)中的

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

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

对于负整数,我们使用一个称为二进制补码的方便表示,它是补码(所有e s翻转为1,所有0 s翻转为0 s )加上一个。

这很方便有两个主要原因:

  • 我们立即知道,如果一个数字为负数,则通过查看单个位,即我们使用的1中最重要的位。

  • 32中使用常规加法在数学上是正确的,就像你在小学里学到的一样。这意味着如果处理器已经添加,则处理器不需要执行任何特殊操作来实现减法。他们可以简单地找到x - y = x + -y的二进制补码(调用,翻转位并添加一个),然后使用他们已有的加法电路添加yx,而不是减法专用电路。

答案 1 :(得分:11)

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

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

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

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

那是uint。整体惯例是:

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

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

答案 2 :(得分: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(除负位之外的所有数字),即2 ^ 30 + 2 ^ 29 + 2 ^ 28 + ..... ...... + 2 ^ 1 + 2 ^ 0或2,147,483,647。

最低为1000000 ......... 0,意思是-2 ^ 31或-2147483648。

答案 3 :(得分:2)

这是高级语言导致的吗?! Eeek!

正如其他人所说,这是一个基础计数系统。人类天生就是自然基础10个计数器,虽然由于某种原因时间基数为60,基数为13时为6 x 9 = 42.阿兰图灵显然擅长基础17心算。

计算机在基座2中运行,因为电子设备很容易打开或关闭 - 代表1和0,这就是基座2所需的全部。您可以以打开,关闭或关闭的方式构建电子设备。中间某个地方。这将是3个州,允许你进行大学数学(而不是二进制数学)。然而,可靠性降低了,因为很难区分这三种状态,电子设备要复杂得多。更多级别导致更差的可靠性。

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