为什么 2 的 32 次方会产生以字节而不是位为单位的数字?
Why 2 raised to 32 power results in a number in bytes instead of bits?
刚刚重新开始C编程学习。现在,我正在研究内存的存储容量以及位和字节的区别。我遇到了 this definition。
有一个 32 位系统的计算。我很困惑,因为在这个计算中 2^32 = 4294967296 字节,这意味着大约 4 GB。我的问题是:为什么 2 的 32 次幂会导致以字节而不是位为单位的数字?
谢谢你的帮助。
因为内存是字节寻址的(即每个字节都有自己的地址)。
有两种方法可以看这个:
一个 32 位整数可以包含 2^32 个不同的值之一。因此,uint32_t
可以表示从 0
到 4294967295
的值。
一个32位的地址可以表示2^32个不同的地址。正如斯科特所说,在字节可寻址系统上,这意味着可以寻址 2^32 个不同的字节。因此,具有 32 位指针的进程最多可以寻址 4 GiB 的虚拟内存。或者,具有 32 位地址总线的微处理器最多可以寻址 4 GiB 的 RAM。
我们说内存是字节寻址的,你可以认为字节是内存的最小单位,所以你不是按位读取,而是按字节读取。原因可能是最小的数据类型是1个字节,即使c/c++中的boolean类型也是1个字节。
该描述非常肤浅,遗漏了很多重要的考虑因素,尤其是关于如何定义和访问的内存。
从根本上说,一个 N 位值有 2N 种可能的状态,因此一个 16 位值有 65,536 种可能的状态。此外,内存以 字节 或 8 位值的形式访问。情况并非总是如此,旧机器有不同的 "word" 大小,每个字 4 到 36 位 occasionally more,但随着时间的推移,8 位字或 "byte" 变成了主要形式。
在每种情况下,内存 "address" 都包含一个 "word" 或者,在更现代的机器上,"byte"。为简单起见,内存以这些单位测量,如 "kilowords" 或 "gigabytes",即使各个内存芯片本身是根据位指定的。例如,一个1gigabyte内存条上往往有8个gigabit芯片。这些芯片被同时读取,结果数据合并产生单个 byte 内存。
根据那篇文章的不稳定定义,这意味着 16 位 CPU 只能寻址 64KB 的内存,这是错误的。 1980 年代的 DOS 系统使用两个指针来表示内存,segment and an offset,并且可以使用有效的 24 位指针寻址 16MB。这不是原始指针大小和总可寻址内存可能不同的唯一方式。
一些 32 位系统还有一个备用 36-bit memory model 允许寻址多达 64GB 的内存,尽管单个进程被限制为可用内存的 4GB 片。
换句话说,对于具有指向内存地址和的单个指针的系统,其中最小内存单元是一个字节然后最大可寻址内存为 2N 字节。
值得庆幸的是,由于 64 位系统现在已经司空见惯,而且内存超过 64GB 的计算机甚至都不是奇特或不寻常的,因此在必须解决指针大小限制时,寻址系统现在要简单得多。
刚刚重新开始C编程学习。现在,我正在研究内存的存储容量以及位和字节的区别。我遇到了 this definition。 有一个 32 位系统的计算。我很困惑,因为在这个计算中 2^32 = 4294967296 字节,这意味着大约 4 GB。我的问题是:为什么 2 的 32 次幂会导致以字节而不是位为单位的数字?
谢谢你的帮助。
因为内存是字节寻址的(即每个字节都有自己的地址)。
有两种方法可以看这个:
一个 32 位整数可以包含 2^32 个不同的值之一。因此,uint32_t
可以表示从 0
到 4294967295
的值。
一个32位的地址可以表示2^32个不同的地址。正如斯科特所说,在字节可寻址系统上,这意味着可以寻址 2^32 个不同的字节。因此,具有 32 位指针的进程最多可以寻址 4 GiB 的虚拟内存。或者,具有 32 位地址总线的微处理器最多可以寻址 4 GiB 的 RAM。
我们说内存是字节寻址的,你可以认为字节是内存的最小单位,所以你不是按位读取,而是按字节读取。原因可能是最小的数据类型是1个字节,即使c/c++中的boolean类型也是1个字节。
该描述非常肤浅,遗漏了很多重要的考虑因素,尤其是关于如何定义和访问的内存。
从根本上说,一个 N 位值有 2N 种可能的状态,因此一个 16 位值有 65,536 种可能的状态。此外,内存以 字节 或 8 位值的形式访问。情况并非总是如此,旧机器有不同的 "word" 大小,每个字 4 到 36 位 occasionally more,但随着时间的推移,8 位字或 "byte" 变成了主要形式。
在每种情况下,内存 "address" 都包含一个 "word" 或者,在更现代的机器上,"byte"。为简单起见,内存以这些单位测量,如 "kilowords" 或 "gigabytes",即使各个内存芯片本身是根据位指定的。例如,一个1gigabyte内存条上往往有8个gigabit芯片。这些芯片被同时读取,结果数据合并产生单个 byte 内存。
根据那篇文章的不稳定定义,这意味着 16 位 CPU 只能寻址 64KB 的内存,这是错误的。 1980 年代的 DOS 系统使用两个指针来表示内存,segment and an offset,并且可以使用有效的 24 位指针寻址 16MB。这不是原始指针大小和总可寻址内存可能不同的唯一方式。
一些 32 位系统还有一个备用 36-bit memory model 允许寻址多达 64GB 的内存,尽管单个进程被限制为可用内存的 4GB 片。
换句话说,对于具有指向内存地址和的单个指针的系统,其中最小内存单元是一个字节然后最大可寻址内存为 2N 字节。
值得庆幸的是,由于 64 位系统现在已经司空见惯,而且内存超过 64GB 的计算机甚至都不是奇特或不寻常的,因此在必须解决指针大小限制时,寻址系统现在要简单得多。