Problem polega na tym, aby utworzyć rodzaj dużej biblioteki całkowitej. Chcę uczynić to zarówno na platformie, jak i tak szybko, jak to możliwe. Oznacza to, że powinienem próbować robić matematykę z tak dużymi typami danych, jakie są natywnie obsługiwane w systemie.Znajdź największy rodzimy typ liczby całkowitej na bieżącej platformie.
Nie chcę wiedzieć, czy kompiluję dla systemu 32- lub 64-bitowego; wszystko, czego potrzebuję, to sposób na utworzenie 64-bitowego lub 32-bitowego pliku lub dowolnej liczby całkowitej w oparciu o to, co jest największym dostępnym. Będę używał sizeof, aby zachowywać się inaczej w zależności od tego, co to jest.
Oto kilka możliwych rozwiązań i ich problemy:
Użyj opcji sizeof (void *): Daje wielkość wskaźnika do pamięci. Jest możliwe (choć jest mało prawdopodobne), że system może mieć większe wskaźniki do pamięci, niż jest w stanie wykonać matematykę lub odwrotnie.
Zawsze używaj długo: Podczas gdy prawdą jest, że na wielu platformach długie liczby całkowite są 4 bajty lub 8 bajtów w zależności od architektury (mój system jest jednym z takich przykładów), niektóre kompilatory implementują długie liczby całkowite jako 4 bajty, nawet na 64 systemy bitowe.
Zawsze używaj długo długo: W wielu systemach 32-bitowych jest to 64-bitowa liczba całkowita, która może nie być tak wydajna (choć prawdopodobnie bardziej wydajna niż jakikolwiek kod, który piszę). Prawdziwy problem polega na tym, że może nie być obsługiwany w ogóle na niektórych architekturach (takich jak ten, który zasila mój odtwarzacz mp3).
Dla podkreślenia, mój kod nie obchodzi, jaki jest rzeczywisty rozmiar liczby całkowitej po wybraniu (zależy od sizeof() dla czegokolwiek, gdzie rozmiar ma znaczenie). Chcę tylko wybrać typ liczby całkowitej, która spowoduje, że mój kod będzie najbardziej wydajny.
Pierwszą rzeczą, która przychodzi mi do głowy, jest ustalenie wielkości rejestrów procesora w pewien sposób ... – BlackBear
czy szukałeś odpowiedzi w istniejących bibliotekach Bignum? http://sourceforge.net/projects/bignlibacbignum/ – mth
Być może próbując coś w nich przenieść, dodaj coś i sprawdź flagę przepełnienia. – BlackBear