作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我刚刚在我的 32 位机器上尝试了 MSVC 2010 中的一些东西,发现我可以在我的程序中使用 __int64
- 这确实有效!
这怎么可能?
最佳答案
32 位算法在 16 位系统上的工作方式相同。
在这种情况下,它使用 2 个 32 位的内存地址一起组成一个 64 位的数字。加法/减法很容易,你可以分部分来做,唯一的问题就是从较低的部分到较高的部分进行结转。对于乘法/除法,它更难(即更多指令)。
它显然很慢,比用于乘法的 32 位算术要慢很多,但如果你需要它,它就在那里。当您升级到 64 位
processor
编译器时,它会自动优化为具有更大字长的一条指令。
在 Release模式下编译的 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
如您所见,它比普通乘法慢很多。
关于c++ - __int64 在 32 位机器上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2692329/
我正在尝试在 Matlab 中使用 mex 编译一个库。我能够部分编译这个东西,但是在最后一个文件中,mex 给出了关于两行的错误: typedef __int64 LONG64; typedef _
我很惊讶地发现我的 C++ 编译器还支持 __int8、__int16、__int32 和 __int64;但我只看到它们等同于 char、short、int 和 long long。它们有什么区别?
我是一名优秀的程序员,十分优秀!