这个问题:How many bits does a WORD contain in 32/64 bit OS respectively?,提到字大小是指处理器寄存器的位大小,我认为它是指计算机处理器操作的位数,即处理器操作的最小"不可分割"位数.

对吗?使用Word/Excel/等软件,安装程序可以 Select 32位或64位安装.有什么关系?

由于计算机体系 struct 是固定的,在我看来,"32位"软件的设计将与具有32位体系 struct 的计算机体系 struct 保持一致.64位程序将努力使指令集与64位字大小保持一致.

对吗?

这里提出了一个非常类似的问题:From a programming point of view, what does it mean when a program is 32 or 64 bit?——公认的答案提到,区别在于可以分配给应用程序的内存量.但这太模糊了——除非32位/64位软件作为一个概念与32位/64位字处理器的大小完全无关?

推荐答案

单词大小是一个主要区别,但它不是唯一的区别.它倾向于定义一个CPU的"额定"位数,但字大小和总体性能只是松散相关.而整体能力才是最重要的.

在英特尔或AMD CPU上,32位与64位软件实际上指的是CPU运行时的运行模式.32位模式的可用寄存器和指令更少/更小,但最重要的限制是可用内存量.32-bit software is generally limited to using between 2GB and just under 4GB of memory

内存的每个字节都有一个唯一的地址,这与每个房子都有一个唯一的邮政地址没有太大区别.内存地址只是一个数字,程序一旦将数据保存在内存中,就可以使用它再次查找数据,内存的每个字节都必须有一个地址.如果一个地址是32位,那么有2^32个可能的地址,这意味着2^32个可寻址的内存字节.在今天的Intel/AMD CPU上,内存地址的大小与寄存器的大小相同(尽管并非总是如此).

对于32位地址,程序可以寻址4 GB(2^32字节),但是操作系统保留了多达一半的空间.放入可用存储空间必须适合程序代码、数据,通常还包括要访问的文件.在今天的个人电脑中,有许多千兆字节的RAM,这无法利用可用内存.这是64位变得流行的主要原因.64位CPU已经存在并被广泛使用了几年(通常是在32位模式下),直到大于2 GB的内存变得普遍,从那时起,64位模式开始提供现实世界的优势,并变得流行起来.64位的内存地址空间提供了16EB的可寻址内存(~18万亿字节),这超过了任何当前软件所能使用的容量,当然,没有一台PC拥有接近那么大的RAM.

典型应用中使用的大多数数据,即使在64位模式下,也不需要是64位的,因此大部分数据仍然以32位(甚至更小)格式存储.文本的常见ASCII和UTF-8表示使用8位数据格式.如果程序需要将一大块文本从内存中的一个位置移动到另一个位置,它可能会try 一次移动64位,但如果需要解释文本,它可能会一次移动8位.同样,32位是整数的常见大小(最大范围为+/-2^31,或大约+/-21亿).21亿的范围足以满足多种用途.图形数据通常是逐像素自然表示的,每个像素通常最多包含32位数据.

不必要地使用64位数据有一些缺点.64位数据在内存中占用更多空间,在CPU缓存中占用更多空间(CPU用于短期存储的非常快的内存).内存只能以最大速率传输数据,而64位数据是最大速率的两倍.如果浪费使用,这可能会降低性能.如果需要同时支持32位和64位版本的软件,在可能的情况下使用32位值可以减少这两个版本之间的差异,使开发更容易(但并不总是这样).

在32位之前,地址和字大小通常是不同的(例如,16位8086/88具有20位内存地址但有16位寄存器,或8位6502具有16位内存地址,甚至早期32位ARM具有26位地址).虽然没有程序员会对更好的寄存器嗤之以鼻,但内存空间通常是每一代先进技术的真正驱动力.这是因为大多数程序员很少直接使用寄存器,而是直接使用内存,内存限制直接导致程序员不愉快,在32位到64位的情况下,用户也不愉快.

综上所述,虽然不同的位大小之间存在着真正和重要的技术差异,但32位或64位(或16位或8位)means实际上只是一组功能,这些功能往往与特定技术代的CPU和/或利用这些功能的软件相关联.字长是其中的一部分,但不是唯一的部分,也不一定是最重要的部分.

来源:在所有这些技术时代都是程序员.

C++相关问答推荐

C限制限定符是否可以通过指针传递?

设计处理各种数据类型的方法和数据 struct

如何正确地索引C中的 struct 指针数组?

在struct中调用函数,但struct在void中 *

为什么GCC C23中的关键字FALSE不是整数常量表达式?

将uintptr_t添加到指针是否对称?

`#if`条件中是否允许`sizeof`?

限制不同类型的限定符

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

如何在c中使用具有不同变量类型的内存分配?

为什么WcrTomb只支持ASCII?

从C中的函数返回静态字符串是不是一种糟糕的做法?

如何使用空元素块声明指针数组

在吉陀罗中,_2_1_和CONCAT11是什么意思?

解密Chrome加密密钥

无法将字符串文字分配给 C 中的字符数组

这些表达式是否涉及 C 中定义的复合文字?

Clang 是否为内联汇编生成了错误的代码?

初始化动态分配的布尔二维数组的最佳方法是什么?

将字节/字符序列写入标准输出的最简单形式