64/32 la divisione è supportata direttamente da i386 e possibilmente da altre macchine, purché la parola alta del dividendo sia inferiore al divisore (cioè il dividendo è nell'intervallo 32x32-> 64 moltiplicato per il divisore). Se il compilatore ha un supporto minimo per i tipi a 64 bit, potrebbe essere in grado di riconoscere questa situazione e trarne vantaggio.
Supponendo che tu abbia già controllato l'asm generato e scoperto che non ne approfitta, o se sai che la tua CPU non ha un'istruzione di divisione, allora devi semplicemente fare una divisione lunga come hai imparato in scuola elementare .. eccetto che è base 4294967296 invece di base 10.
Si potrebbe provare a leggere la fonte su libgcc
, poiché contiene il codice per 64/64 per le macchine che non dispongono di supporto nativo.
Modifica: In realtà, poiché non si dispone di un'operazione di divisione 64/32, è possibile che si desideri utilizzare la base 65536. Ciò è dovuto al fatto che una divisione lunga e ingenua richiede la divisione di un numero "a 2 cifre" con un numero "a una cifra" a ogni passaggio. Certo, ora sei bloccato a fare più passi ...
fonte
2010-08-13 06:58:04
Se i tuoi 32 bit inferiori sono 0, non avrai comunque un resto. – ysap
@ysap: non vero. Si consideri '(1L << 32)/3'. –
Sono curioso, stai usando un processore a 32 bit, con un compilatore C ragionevolmente aggiornato, che non supporta bene gli interi a 64 bit? Cos'è questa combinazione frustrante? – mctylr