Oppure

Loading
03/07/10 13:03
pierotofy
Se le due variabili ad esempio sono interi unsigned da 32 bit (2^32-1) e nelle due variabili hai 429496720 e 429496721, sommandoli andrai in arithmetic overflow. it.wikipedia.org/wiki/…
Il mio blog: piero.dev
03/07/10 13:08
TheKaneB
Postato originariamente da Alex:

ma perchè dovrebbe aver problemi?


a:=5;
b:=2;

a:=a+b;
b:=a-b;
a:=a-b;

insomma..alla fine e dimostrato matematicamente....basta semplificare...


La matematica è una cosa, la ALU della cpu è un'altra cosa :D

se a e b, ad esempio, sono numeri in floating point, avrai sicuramente una certa perdita di precisione durante le varie operazioni, degradando quindi i due numeri tramite arrotondamenti successivi. Quando programmi, butta anche un'occhio su come funziona il computer, e non soltanto su come funziona l'algoritmo... ;-)

Resta comunque il fatto che il modo migliore per scambiare due variabili è, SEMPRE E COMUNQUE, quello di usare una terza variabile di appoggio. Il motivo, anche qui, è da ricercarsi dentro la CPU. In sostanza con il classico scambio a 3 variabili, usi delle semplici istruzioni MOVE tra registri o locazioni di memoria.

Invece con i metodo a 2 variabili (sia il mio che il tuo), impegni anche la ALU, con conseguente allungamento dei tempi di esecuzione e potenziali stalli della pipeline. Ad esempio, in un processore superscalare, se la ALU rimane libera, la CPU potrà iniziare l'esecuzione in parallelo di altre istruzioni, invece se la impegni, diminuisci il livello di parallelismo penalizzando (seppur di poco) la velocità di esecuzione.

Si tratta alla fine soltanto di "finezze", ma è importante anche approfondire questi dettagli se si vuole avere una certa dimestichezza con i computer. ;-)
aaa
03/07/10 16:10
Alex
Quindi in pratica con lo scambio a tre semplicemente usa la UC e basta?
aaa
03/07/10 16:13
Alex
Postato originariamente da pierotofy:

Se le due variabili ad esempio sono interi unsigned da 32 bit (2^32-1) e nelle due variabili hai 429496720 e 429496721, sommandoli andrai in arithmetic overflow. it.wikipedia.org/wiki/…


non ci avevo pensato=) giusto=) va in overflow...
aaa
03/07/10 19:01
TheKaneB
Postato originariamente da Alex:

Quindi in pratica con lo scambio a tre semplicemente usa la UC e basta?


Non so cosa sia la UC (immagino una sorta di sigla accedemico-teorica che sta a significare Unità di Controllo), ma ti posso assicurare che la MOV non tocca la ALU, a meno che non usi una modalità di indirizzamento indiretta con registro base + offset, ma anche in questi casi, le CPU moderne hanno un sommatore speciale separato dalla ALU solo per calcolare gli indirizzi, quindi il problema non si pone.
aaa
03/07/10 19:52
Alex
Postato originariamente da TheKaneB:

Postato originariamente da Alex:

Quindi in pratica con lo scambio a tre semplicemente usa la UC e basta?


Non so cosa sia la UC (immagino una sorta di sigla accedemico-teorica che sta a significare Unità di Controllo), ma ti posso assicurare che la MOV non tocca la ALU, a meno che non usi una modalità di indirizzamento indiretta con registro base + offset, ma anche in questi casi, le CPU moderne hanno un sommatore speciale separato dalla ALU solo per calcolare gli indirizzi, quindi il problema non si pone.


UC sta proprio per unit control...unità di controllo...

la mondalità di indirizzamento indiretta come funziona? immagino che si possa fare solo in assembly...che utilità ha?

p.s. cacchio mi piacerebbe sapere ste cose per bene=)
aaa
03/07/10 20:59
TheKaneB
in realtà la modalità di indirizzamento indiretta serve proprio per implementare in modo efficiente i linguaggi di alto livello. Si usa ad esempio per accedere agli alementi di un array, di una struct o di una classe.

Ci pensa il compilatore a scegliere la modalità migliore per ogni operazione.

Se vuoi studiare queste cose procurati un bel libro di architettura dei calcolatori, e studia un po' di assembly (ti consiglio di studiare le macchine RISC).
aaa
04/07/10 13:06
Alex
mi potresti consigliare quelche titolo?

per quanto riguarda l'assembly prima ho intenzione di imparare il c.....infatti oggi acquisto su internet un bel manuale di c.....


per caso hai letto l'arte dell'hacing volumee 1? se si secondo te è una lettura difficile?
aaa