La differenza tra amd64 e i386 è che amd64 è a 64 bit mentre i386 è a 32 bit . Questa è la larghezza (in bit) dei registri disponibili nel core.
Fondamentalmente il numero più grande che un core della CPU a 32 bit può gestire in una sola volta è di poco superiore a 4,29 miliardi, mentre un core a 64 bit può gestire un numero di oltre 18,44 miliardi di miliardi.
I core nei PC moderni sono in grado di comportarsi come un processore a 64 o 32 bit a seconda della versione del sistema operativo installata.
Il codice a 64 bit tende a funzionare più velocemente del codice a 32 bit o perché può gestire numeri più grandi in movimento o perché i core a 64 bit hanno più registri in modo da poter archiviare più cose senza bisogno di metterle nella memoria esterna. Sebbene non vi sia alcuna garanzia che il codice a 64 bit verrà eseguito più velocemente se il codice non è stato scritto per sfruttare le funzionalità extra del processore.
La compilazione su un sistema a 32 bit produrrà un codice diverso rispetto a un sistema a 64 bit. È possibile dimostrarlo compilando il codice assembly sui due sistemi. Supponendo che il tuo file C sia myfile.c, prova gcc -S myfile.c
su entrambi i sistemi e confronta myfile.s
Il codice ben scritto per un sistema a 32 bit dovrebbe essere compilato ed eseguito su un sistema a 64 bit, ma non tutto il codice è ben scritto. Molti programmatori fanno ipotesi sul sistema che potrebbero non essere vere: come la larghezza del registro o l'ordine dei byte.
Senza l'accesso al codice sorgente è difficile capire quale sia il problema, ma segmenation fault
indica che è stato effettuato un tentativo di accedere alla memoria che non appartiene al programma. Ciò può, ad esempio, indicare che mem_ptr è un puntatore a 32 bit che va bene su un sistema a 32 bit ma deve essere un puntatore a 64 bit su un sistema a 64 bit.