在32位机器上使用64位时间戳

时间:2014-10-21 11:04:51

标签: unix integer timestamp cpu 32bit-64bit

我们都知道Y2K问题,这个问题很快就会在2038年到来。所有的解决方案我都读过它说是"使用64位操作系统"所以我有一个问题;如果我的程序是使用任何64位平台编译的,那么可以在只能使用32位的机器上运行,例如旧的Pentium CPU?我读了一些资源,说int_64bit可以通过使用两个32位整数表示在32位机器上。

1 个答案:

答案 0 :(得分:0)

简单答案是

  • 为64位平台编译的程序无法在32位处理器上运行。

  • 时间戳主要是特定于应用程序的,您的编程语言负责处理它,而操作系统将负责处理。

看到您需要了解两件事

  1. 在64位平台上编译并不意味着您的应用程序是64位。您可以在64位平台上编译32位应用程序。

  2. 现在,您可以看到在计算机上运行的所有程序或应用程序都是由处理器执行的,因此每个程序都将在其执行之前的最后时刻进行转换或对象代码或机器代码。处理器,这些“位”实际上表示处理器具有的“寄存器”(处理器使用的内存种类)的大小。因此,关键是每当将高级语言(如程序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)

Image of a processor register

为简单起见,处理器内部有许多寄存器,我只使用x86_64处理器的EAX和RAX寄存器。对于x86_64,处理器(64位)知道这些“ RAX”和“ EAX”的含义。但是32位处理器(x86)无法理解“ RAX”的含义。那就是为什么32位程序可以在64位计算机上运行而无法执行相反操作的唯一原因。...

注意:它不仅是寄存器,而且可以包含处理器特定的指令。较新的处理器可能不支持较新的处理器支持的所有指令。

示例:“ imul reg,reg”(整数乘法)指令仅可用于Intel 80386及更高版本

我知道这有点令人困惑。它的解释有点复杂。我仍然希望这能解决您的问题。