C语言 为什么 2 的幂提高到 32 次方会导致以字节为单位的数字而不是位?



我只是重新开始C编程研究。现在,我正在研究内存存储容量以及位和字节之间的区别。我遇到了这个定义。 有一个计算到32位系统。我很困惑,因为在这个计算中 2^32 = 4294967296 字节,这意味着大约 4 GB。我的问题是:为什么 2 的 32 次方会导致以字节为单位的数字而不是位?

谢谢你帮助我。

因为内存是字节可寻址的(即每个字节都有自己的地址(。

有两种方法可以查看此内容:

32 位整数可以容纳 2^32 个不同值之一。因此,uint32_t可以表示从04294967295的值。

一个 32 位地址可以表示 2^32 个不同的地址。正如Scott所说,在字节可寻址系统上,这意味着可以寻址2^32个不同的字节。因此,具有 32 位指针的进程最多可以寻址 4 GiB 的虚拟内存。或者,具有 32 位地址总线的微处理器可以寻址高达 4 GiB 的 RAM。

这种描述真的很肤浅,忽略了许多重要的考虑因素,尤其是关于如何定义访问内存。

从根本上说,N 位值有 2N个可能的状态,因此 16 位值有 65,536 个可能的状态。此外,内存以字节或 8 位值的形式访问。情况并非总是如此,较旧的机器具有不同的"字"大小,每个字从 4 位到 36 位不等,偶尔会更多,但随着时间的推移,8 位字或"字节"成为主导形式。

在每种情况下,内存"地址"都包含一个"字",或者在更现代的机器上包含"字节"。为了简单起见,内存以这些单位(如"千字"或"千兆字节"(进行测量,即使单个内存芯片本身是以位指定的。例如,一个 1GB 的内存模块上通常有 8个千兆位的芯片。这些芯片同时被读取,将产生的数据组合成一个字节的存储器。

根据该文章不稳定的定义,这意味着 16 位 CPU 只能寻址 64KB 的内存,这是错误的。1980年代的DOS系统使用两个指针来表示内存,一个和一个偏移量,并且可以使用有效的24位指针寻址16MB。这不是原始指针大小和总可寻址内存可能不同的唯一方式。

一些 32 位系统还具有备用 36 位内存模型,允许寻址高达 64GB 的内存,尽管单个进程仅限于可用内存的 4GB 切片。

换句话说,对于具有指向内存地址的单一指针的系统,并且最小内存单元是一个字节,最大可寻址内存为 2N字节。

值得庆幸的是,由于64位系统现在司空见惯,并且具有>64GB内存的计算机甚至不是异国情调或不寻常的,因此寻址系统现在比必须解决指针大小限制要简单得多。

我们说内存是字节可寻址的,你可以认为字节是内存的最小单位,所以你不是按位而是按字节读取。原因可能是最小的数据类型是 1 个字节,甚至 c/c++ 中的布尔类型也是 1 个字节。

最新更新