Różnica między amd64 a i386 polega na tym, że amd64 jest 64-bitowy, a i386 jest 32-bitowy . Jest to szerokość (w bitach) rejestrów dostępnych w rdzeniu.
Zasadniczo największa liczba, którą 32-bitowy rdzeń procesora może obsłużyć za jednym razem, to nieco ponad 4,29 miliarda, podczas gdy 64-bitowy rdzeń może obsłużyć liczbę nieco ponad 18,44 miliarda miliardów.
Rdzenie współczesnych komputerów PC mogą zachowywać się jak procesory 64-bitowe lub 32-bitowe w zależności od zainstalowanej wersji systemu operacyjnego.
Kod 64-bitowy zwykle działa szybciej niż kod 32-bitowy, ponieważ może poradzić sobie z większymi numerami w ruchu lub ponieważ 64-bitowe rdzenie mają więcej rejestrów, dzięki czemu można przechowywać więcej rzeczy bez konieczności umieszczania rzeczy w pamięci zewnętrznej. Chociaż nie ma gwarancji, że 64-bitowy kod będzie działał szybciej, jeśli kod nie został napisany, aby skorzystać z dodatkowych funkcji procesora.
Kompilacja w systemie 32-bitowym da inny kod niż system 64-bitowy. Możesz to udowodnić, kompilując do kodu asemblera w dwóch systemach. Zakładając, że plik C to mój_plik.c spróbuj gcc -S myfile.c
na obu systemach i porównaj mój_plik.s
Dobrze napisany kod dla systemu 32-bitowego powinien się skompilować i uruchomić w systemie 64-bitowym, ale nie cały kod jest dobrze napisany. Wielu programistów przyjmuje założenia dotyczące systemu, które mogą nie być prawdziwe: na przykład szerokość rejestru lub kolejność bajtów.
Bez dostępu do kodu źródłowego trudno jest zrozumieć, na czym polega problem, ale segmenation fault
wskazuje, że podjęto próbę uzyskania dostępu do pamięci, która nie należy do programu. Może to na przykład wskazywać, że mem_ptr jest 32-bitowym wskaźnikiem, który jest odpowiedni w systemie 32-bitowym, ale musi być 64-bitowym wskaźnikiem w systemie 64-bitowym.