这个问题:一个字在32/64位操作系统中分别包含多少位?提到字长是指处理器寄存器的位长-我指的是计算机处理器操作的位数,即处理器操作的最小“不可分割”位数。
那是对的吗?使用Word / Excel / etc等软件,安装程序可以选择32位或64位安装。有什么不同?
由于计算机体系结构是固定的,因此在我看来,“ 32位”软件将被设计为与具有32位体系结构的计算机体系结构保持一致。64位程序将努力使指令集与64位字长对齐。
那是对的吗?
这里提出了一个非常类似的问题:从编程的角度来看,当程序是32位或64位时,这意味着什么?-并且接受的答案提到差异是可以分配给应用程序的内存量。但这太含糊-除非32位/ 64位软件的概念与32位/ 64位字处理器的大小完全无关?
Joh*_*ger 31
您参考的答案描述了64位优于32位的优点。至于程序本身的实际区别,取决于您的观点。
一般来说,程序源代码不必完全相同。可以编写大多数程序,以便在适当选择编译器和/或编译器选项的控制下,它们可以像32位或64位程序一样完美地编译。但是,通常会对源产生一些影响,因为针对64位的(C)编译器可能会选择不同地定义其类型。特别是,long int在32位平台上普遍为32位宽,但在许多(但不是全部)64位平台上为64位宽。这可能是代码中的错误的来源,这些错误对此类详细信息做出了不必要的假设。
主要区别在于二进制文件。64位程序利用其64位目标CPU的完整指令集,这些指令集总是包含32位对应CPU不包含的指令。他们将使用32位对应CPU没有的寄存器。他们将使用适合其目标CPU的函数调用约定,这通常意味着与32位程序相比,在寄存器中传递更多的参数。使用这些和其他64位CPU设施可提供功能优势,例如使用更多内存的能力和(有时)提高的性能。
flu*_*eap 28
字长是主要区别,但不是唯一的。它倾向于定义CPU被“评级”的位数,但是字长和整体功能只是松散相关。整体能力至关重要。
在Intel或AMD CPU上,32位与64位软件实际上是指CPU运行时所处的模式。32位模式具有较少/较小的可用寄存器和指令,但是最重要的限制是可用的内存量。 通常限制32位软件使用2GB到不足4GB的内存。
存储器的每个字节都有一个唯一的地址,这与每个具有唯一的邮政地址的房子没有太大的不同。内存地址只是一个数字,程序将其保存到内存后就可以用来再次查找数据,并且内存的每个字节都必须有一个地址。如果地址是32位,则存在2 ^ 32个可能的地址,这意味着2 ^ 32个可寻址的内存字节。在当今的Intel / AMD CPU上,内存地址的大小与寄存器的大小相同(尽管并非总是如此)。
通过32位地址,程序可以寻址4GB(2 ^ 32字节),但是OS最多保留一半的空间。可用的存储空间必须适合程序代码,数据,通常还可以容纳要访问的文件。在具有许多GB RAM的当今PC中,这无法利用可用内存。这就是64位流行的主要原因。64位CPU可用并被广泛使用(通常在32位模式下)已经有好几年了,直到内存大小超过2GB成为普遍现象,此后64位模式开始提供实际优势,并开始流行。64位的内存地址空间可提供16艾字节的可寻址内存(约18兆字节),这超出了当前任何软件都可以使用的内存,当然,没有PC具有如此大的RAM。
即使在64位模式下,典型应用程序中使用的大多数数据也不需要为64位,因此大多数数据仍以32位(甚至更小的)格式存储。文本的常见ASCII和UTF-8表示形式使用8位数据格式。如果程序需要将一大块文本从一个位置移动到内存中的另一个位置,则可以尝试一次将其移至64位,但是如果需要解释文本,则可能一次将其移至8位。 。类似地,32位是整数的通用大小(最大范围为+/- 2 ^ 31,或大约+/- 21亿)。21亿美元足够用于多种用途。图形数据通常以像素为单位自然地表示,每个像素通常最多包含32位数据。
不必要地使用64位数据有一些缺点。64位数据会占用更多的内存空间,并占用更多的CPU缓存空间(CPU使用的非常快的内存用于短期存储)。内存只能以最大速率传输数据,而64位数据则是其两倍。如果浪费使用,可能会降低性能。并且,如果有必要同时支持32位和64位版本的软件,则在可能的情况下使用32位值可以减少两个版本之间的差异并简化开发过程(尽管并非总是如此)。
在32位之前,地址和字长通常是不同的(例如,具有20位存储器地址但16位寄存器的16位8086/88,或具有16位存储器地址的8位6502,甚至32位早期)位具有26位地址的ARM)。尽管没有程序员会为更好的寄存器而着迷,但内存空间通常是每一代技术发展的真正动力。这是因为大多数程序员很少直接使用寄存器,而是直接使用内存,并且内存限制直接导致程序员不愉快,在32位至64位的情况下,也给用户带来不愉快。
综上所述,尽管各种位大小之间存在着真正重要的技术差异,但32位或64位(或16位或8位)的真正含义实际上只是与之相关的功能的集合。特定技术一代的CPU和/或利用这些功能的软件。字长是其中的一部分,但不是唯一的,也不一定是最重要的部分。
资料来源:在所有这些技术时代都是程序员。
Aco*_*orn 12
程序运行在由处理器实现的给定体系结构(架构或ISA)之上。通常,架构定义“主要”字长,即大多数寄存器的大小以及这些寄存器上运行的操作(尽管您可以设计工作原理不同的架构)。尽管体系结构可能允许使用不同大小的寄存器进行操作,但这通常被称为“本机”字长。
此外,处理器使用内存,并且需要以某种方式寻址该内存-这意味着要使用这些地址进行操作。因此,这些地址通常可以像其他任何数字一样进行存储和操作,这意味着您具有能够保存它们的寄存器。尽管既不需要这些寄存器匹配字长,也不需要从单个寄存器中计算出地址,但在某些体系结构中就是这种情况。
在整个历史中,有许多不同字长的体系结构,甚至是怪异的。如今,您可以轻松找到周围的处理器,这些处理器不仅是32位和64位的,而且还包括8位和16位的(通常在嵌入式设备中)。在典型的台式计算机中,您使用的x86或x64分别是32位和64位。
因此,当您说程序是32位或64位时,是指特定的体系结构。在流行的桌面方案中,您指的是x86与x64。有很多问题,文章和书籍讨论了两者之间的区别。
现在,最后一点要注意:出于兼容性原因,x64处理器可以在不同的模式下运行,其中一种能够运行x86的32位代码。这意味着,如果您的计算机是x64(可能),并且您的操作系统支持它(也可能是Windows 64位),则它仍可以运行针对x86编译的程序。
使用Word / Excel / etc等软件,安装程序可以选择32位或64位安装。有什么不同?
这取决于使用的CPU:
在SPARC CPU上,“ 32位”程序和“ 64位”程序之间的区别正是您所认为的:
64位程序使用32位SPARC CPU不支持的其他操作。另一方面,Solaris或Linux操作系统将由64位程序访问的数据放置在只能使用64位指令访问的内存区域中。这意味着64位程序甚至必须使用32位CPU不支持的指令。
对于x86 CPU,这是不同的:
现代x86 CPU具有不同的操作模式,并且可以执行不同类型的代码。在不同的模式下,它们可以执行16位,32位或64位代码。
在16位,32位和64位代码中,CPU对字节的解释不同:
字节(十六进制)b8 4e 61 bc 00 c3将被解释为:
mov eax,0xbc614e
ret
Run Code Online (Sandbox Code Playgroud)
...以32位代码形式:
mov ax,0x614e
mov sp,0xc300
Run Code Online (Sandbox Code Playgroud)
...以16位代码表示。
CPU必须对“ 64位安装”和“ 32位安装”的EXE文件中的字节进行不同的解释。
64位程序将努力使指令集与64位字长对齐。
当CPU不是16位CPU时,16位代码(请参见上文)可以访问32位寄存器。
因此,“ 16位程序”可以访问32位或64位x86 CPU上的32位寄存器。
| 归档时间: |
|
| 查看次数: |
7188 次 |
| 最近记录: |