整数如何存储在内存中
本文关键字:内存 存储 何存储 整数 | 更新日期: 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 个不同的符号来表示一个数字。我们通常使用符号 0
和 1
.在我们通常的基础中,我们使用10
不同的符号来表示所有数字,0
,1
,2
,... 8
,9
。
为了进行比较,请考虑一个不适合我们通常系统的数字。像14。我们没有 14 的符号,那么我们如何表示它呢?很简单,我们只需将两个符号组合在一起 1
和 4
. 以 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
的二进制补码(召回,翻转位并加一个(,然后使用他们已经拥有的加法电路将x
和y
相加,而不是使用特殊的减法电路。
这根本不是一个愚蠢的问题。
让我们从 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 个州,允许您进行第三级数学(而不是二进制数学(。然而,可靠性降低了,因为很难区分这三种状态,而且电子设备要复杂得多。更高的级别会导致更差的可靠性。
尽管它是在多级单元闪存中完成的。在这些中,每个存储单元代表开、关和一些中间值。这提高了容量(每个单元可以存储几个位(,但对于可靠性来说,这是个坏消息。这种芯片用于固态驱动器,这些驱动器在完全不可靠的边缘运行,以最大限度地提高容量。