如果你不介意的小黑客,這可能會幫助(64位模式下,未測試):
#include <windows.h>
#include <stdio.h>
unsigned char udiv128Data[] =
{
0x48, 0x89, 0xD0, // mov rax,rdx
0x48, 0x89, 0xCA, // mov rdx,rcx
0x49, 0xF7, 0xF0, // div r8
0x49, 0x89, 0x11, // mov [r9],rdx
0xC3 // ret
};
unsigned char sdiv128Data[] =
{
0x48, 0x89, 0xD0, // mov rax,rdx
0x48, 0x89, 0xCA, // mov rdx,rcx
0x49, 0xF7, 0xF8, // idiv r8
0x49, 0x89, 0x11, // mov [r9],rdx
0xC3 // ret
};
unsigned __int64 (__fastcall *udiv128)(unsigned __int64 numhi,
unsigned __int64 numlo,
unsigned __int64 den,
unsigned __int64* rem) =
(unsigned __int64 (__fastcall *)(unsigned __int64,
unsigned __int64,
unsigned __int64,
unsigned __int64*))udiv128Data;
__int64 (__fastcall *sdiv128)(__int64 numhi,
__int64 numlo,
__int64 den,
__int64* rem) =
(__int64 (__fastcall *)(__int64,
__int64,
__int64,
__int64*))sdiv128Data;
int main(void)
{
DWORD dummy;
unsigned __int64 ur;
__int64 sr;
VirtualProtect(udiv128Data, sizeof(udiv128Data), PAGE_EXECUTE_READWRITE, &dummy);
VirtualProtect(sdiv128Data, sizeof(sdiv128Data), PAGE_EXECUTE_READWRITE, &dummy);
printf("0x0000ABCDEF000000000000/0x0001000000000000 = 0x%llX\n",
udiv128(0x0000AB, 0xCDEF000000000000, 0x0001000000000000, &ur));
printf("-6/-2 = %lld\n",
sdiv128(-1, -6, -2, &sr));
return 0;
}
它不是CRT的一部分。這是一個內在的,來處理器免費。但僅限於64位模式。直到你得到一個128位的處理器,沒有免費的div。鑑於pow的範圍很廣(2,128),你應該尋找任意精度庫。周圍有很多人。 –
@TreeMonkie:__int18不支持VS,請參閱http://stackoverflow.com/questions/6759592/how-to-enable-int128-on-visual-studio – cxxl
@Hans:對不起,我不明白。它不是一個內在的,即使在64位模式。我需要它*寫*任意精度庫:) – cxxl