__int64在32位机器上? [英] __int64 on a 32-Bit machine?
问题描述
我刚刚在我的32位机器上的MSVC 2010中尝试了一下,发现我可以在我的程序中使用__int64 - 这实际上是工作!
I just tried something in MSVC 2010 on my 32-bit machine here and found out that I can use __int64 in my programs - which actually work!
- 如何实现?
推荐答案
在这种情况下,它使用2个32位内存地址组合成一个64位的数字。加法/减法很容易,你通过零件做,唯一的得到是从下部到较高部分的遗留物。对于乘法/除法,它是更难(即更多的指令)。
In this case, it uses 2 32-bit memory addresses to form a 64-bit number together. Addition/substraction is easy, you do it by parts, the only gotcha is taking the carry-over from the lower part to the higher part. For multiplication/division, it's harder (ie more instructions).
这显然很慢,比32位算法比乘法,但如果你需要它,有你的。当你升级到64位处理器编译器时,它会自动优化为一个具有更大字大小的指令。
It's obviously slow, quite a bit slower than 32 bit arithmetic for multiplication, but if you need it, it's there for you. And when you upgrade to a 64-bit processor compiler, it gets automatically optimized to one instruction with the bigger word size.
2010在32位处理器上专业实现64位乘法,在发布模式下编译:
The Visual Studio 2010 Professional implementation of 64 bit multiplication on a 32-bit processor, compiled in release mode, is:
_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
正如你所看到的,它比正常的乘法慢。
As you can see, it's a LOT slower than normal multiplication.
这篇关于__int64在32位机器上?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!