想知道数字是如何存储的。例如,它们是将二进制数字 1 保存为 000(31/63 个零)1 还是直接保存为 1?它们如何知道它是一个新数字?换句话说,它如何区分 2 x 1 和 3?如果 64 位系统像这样存储 000(63 个零)1,难道不会花费更多存储空间吗?
答案1
数据存储在字节– 数字 1 至少会占用 8 位:00000001
,并且始终以字节边界开始和结束。当 CPU 访问 RAM 中的数据时,它会寻址整个字节,而不是单个位。
“64 位”标签仅仅意味着所有内存地址长度为 4 个字节(并且 CPU 自然具有处理这么大数字的指令)。
但它并没有改变程序存储所有内容的方式其他数据类型。对于其他所有数据,程序(即其作者)可以选择首选大小,只要它是精确的字节数即可。例如,在 C 语言中,声明为short
或的变量uint16_t
将是 16 位,即 2 个字节。通常的大小为 8、16、32、64 位(即 1、2、4 或 8 个字节),因为这就是 CPU 的工作方式。
(当然,程序可以以任何它们想要的方式存储数据——许多磁盘文件格式做将数字打包成 3 个字节或 5 个字节或其他任何字节 - 但处理起来更复杂。)
继续你的问题,“系统”如何区分一个 32 位数字和两个 16 位数字?答案是不需要。这一切都是在编写和/或编译程序时决定的,因此生成的 CPU 指令直接与特定大小一起工作。
(程序以不同的方式解释相同的数据实际上很常见 - 例如,即使文本可能存储为一系列 1 字节字符,但 strpos() 等函数使用加速技巧,这些技巧依赖于将完全相同的数据解释为一系列 4 字节甚至 8 字节数字。)