32位机器上的__int64?

koa*_*koa 25 c++

我刚刚在我的32位机器上尝试了MSVC 2010中的一些东西,发现我可以在我的程序中使用__int64 - 这实际上有效!

  • 怎么可能?

Bli*_*ndy 36

同样,32位算法也适用于16位系统.

在这种情况下,它使用2个32位内存地址一起形成64位数字.加法/减法很容易,你可以按部分进行,唯一的问题就是从下部到较高部分进行结转.对于乘法/除法,它更难(即更多指令).

它显然很慢,比乘法的32位算术慢一点,但如果你需要它,那就适合你.当您升级到64位处理器编译器时,它会自动优化为具有更大字长的一条指令.

在发布模式下编译的32位处理器上的64位乘法的Visual Studio 2010 Professional实现是:

_allmul PROC NEAR

A       EQU     [esp + 4]       ; stack address of a
B       EQU     [esp + 12]      ; stack address of b

        mov     eax,HIWORD(A)
        mov     ecx,HIWORD(B)
        or      ecx,eax         ;test for both hiwords zero.
        mov     ecx,LOWORD(B)
        jnz     short hard      ;both are zero, just mult ALO and BLO

        mov     eax,LOWORD(A)
        mul     ecx

        ret     16              ; callee restores the stack

hard:
        push    ebx

A2      EQU     [esp + 8]       ; stack address of a
B2      EQU     [esp + 16]      ; stack address of b

        mul     ecx             ;eax has AHI, ecx has BLO, so AHI * BLO
        mov     ebx,eax         ;save result

        mov     eax,LOWORD(A2)
        mul     dword ptr HIWORD(B2) ;ALO * BHI
        add     ebx,eax         ;ebx = ((ALO * BHI) + (AHI * BLO))

        mov     eax,LOWORD(A2)  ;ecx = BLO
        mul     ecx             ;so edx:eax = ALO*BLO
        add     edx,ebx         ;now edx has all the LO*HI stuff

        pop     ebx

        ret     16              ; callee restores the stack
Run Code Online (Sandbox Code Playgroud)

如您所见,它比正常乘法慢很多.


AnT*_*AnT 6

为什么你觉得它令人惊讶?没有什么可以阻止编译器在32位机器上支持64位,128位或更多位的整数类型.如果感觉像编译器,编译器甚至可以支持57位和91位类型.实际上,在N位机器上支持2N位整数运算是一项相对容易的任务,因为典型机器的指令集通常在设计时考虑到这种功能.


小智 5

32位只是一个机器字的本机大小,意味着它们可以一次处理,并不意味着更大的项目不能处理,它们只需要作为单独的32位单元多次处理步,以同样的方式,它们可以小于一个机器字,在这种情况下,只会处理整个机器字的一部分。