我们都知道Y2K问题,并且这个问题将在2038年很快到来。据我所知,所有解决方案都说“使用64位操作系统”,所以我有一个问题。如果我的程序是用任何64位平台编译的,则可以在只能使用32位的机器上运行,例如旧的Pentium CPU?我读过一些资源,说int_64bit可以通过使用两个32bit整数在32bit机器上表示。
简单答案是
为64位平台编译的程序无法在32位处理器上运行。
时间戳主要是特定于应用程序的,您的编程语言负责处理它,而操作系统将负责。
看到您需要了解两件事
在64位平台上编译并不意味着您的应用程序是64位。您可以在64位平台上编译32位应用程序。
现在了解在计算机上运行的程序或应用程序的所有内容均由处理器执行,因此每个程序在处理器执行之前的最后时刻都会被转换或转换为目标代码或机器代码,并且这些“位”实际上表示处理器具有的“寄存器”(处理器使用的内存类型)的大小。因此,关键是每当将高级语言(如程序C ++)转换为机器代码时。编译器遵循以下步骤(简单来说)
您的源代码--->转换为系统特定的程序集--->二进制代码
然后此二进制代码由处理器执行。现在看到我提到的汇编语言是特定于机器/处理器的。它与ARM处理器,x86处理器,PowerPC处理器等不同。(这些是处理器体系结构)
现在以您的情况为例,我们现在正在考虑32位Intel处理器(x86)如何运行64位程序
您编写了一个将数字10和20加起来的程序,并编译了二进制文件以直接在处理器上运行(暂时忘记了OS及其库)
现在让我们将“您的源代码”转换为32位汇编程序和64位汇编程序
汇编输出(32位或x86代码)
mov eax, 10
add eax, 20 ;OUTPUT IS SAVED TO "EAX" REGISTER WHICH IS A 32 BITS REGISTER
汇编输出(64位或x86_64代码)
mov rax, 10
add rax, 20 ;OUTPUT IS SAVED TO "RAX" REGISTER WHICH IS A 64 BIT REGISTER
现在这些汇编程序正在逐行转换为二进制代码当您在32位处理器上运行64位代码的输出二进制文件时,则32位处理器甚至都不知道“ RAX”是什么,这将立即导致中断(来自处理器的错误)
图中显示了处理器寄存器的图像(特定于x86_64)
为了简单起见,处理器内部有许多寄存器,我只使用x86_64处理器的EAX和RAX寄存器。对于x86_64,处理器(64位)知道这些“ RAX”和“ EAX”的含义。但是32位处理器(x86)无法理解“ RAX”的含义。那就是为什么32位程序可以在64位计算机上运行而无法执行相反操作的唯一原因。...
注意:它不仅是寄存器,还可以有处理器特定的指令。较新的处理器可能不支持较新的处理器支持的所有指令。
[示例:“ imul reg,reg”(整数乘法)指令仅可用于Intel 80386及更高版本
我知道这有点令人困惑。它的解释有点复杂。我仍然希望这能解决您的问题。