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

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

我的问题是 – 整数存储在计算机内存中怎么样?

在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不同的符号来表示所有数字, 0 ,… 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(也称为hex)中,我们有足够的符号来表示仅使用其中一个的14 。 您通常会看到使用hex符号e编写的14

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

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

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

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

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

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

  • 你有一个uits 32位。 为每个位分配一个从0到31的数字。按照惯例,最右边的位是0,最左边的位是31。
  • 取每个位数并将2加到该功率,然后将其乘以该位的值。 因此,如果第三位是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
  • 如果该值大于或等于0且严格小于2 31那么您就完成了。 int和uint值相同。
  • 否则,从uint值中减去 2 32 ,这就是int值。

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

二进制的工作方式如下(作为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。

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

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

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

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