View Full Version : memoria computer programmazione
gaiapuffo
14-07-2011, 09:46
ciao volevo chiedere una cosa...quando salvo un dato vi è il vincolo di allineamento cioè la memoria è fatta in questo modo
0
4
8
12 ecc
quindi i dati vengono salvati in blocchi da 4 byte ma se io ad esempio ho una variabile di tipo int
e la trasformo in una short in tutti casi anche la variabile short occuperà 4 byte solo che potra contenere una valore più piccolo?
Marinelli
14-07-2011, 14:27
Discussione spostata nella sezione dedicata alla programmazione.
Ciao.
wingman87
14-07-2011, 15:53
Esempio pratico:
a è un intero di 4 byte
b è un intero di 2 byte
se esegui un assegnamento b=a ci sono 2 casi:
1: il valore di a è nel range di valori rappresentabili con 2 byte -> in b il valore viene copiato correttamente
2: il valore di a è fuori dal range -> in b il valore viene copiato troncato (c'è perdita di informazione).
Per questo genere di operazioni è richiesto un cast esplicito perché così il programmatore deve assumersi la responsabilità di un eventuale errore dovuto a troncamento.
Non ti ho risposto direttamente ma spero che tu abbia capito.
la short, essendo solo di 2 byte, potra cotenere solo 2^16 valori. Non è corretta la tesi di wingman87:
immaginiamo, per semplicità, di usare uno short (2 byte) e 1 byte.
ovviamente, per ogni short salvato leggerò 2 byte: il primo sarà 0 se il valore salvato è < di 2^8 (senza segno), e quindi il secondo byte letto conterrà il valore giusto.
Altrimenti leggerai in entrambi i casi un valore erroneo. Mettiamola così: Se vuoi mettere una variabile in una più piccola, controlla che tutti i byte rimententi (partendo dal fondo) siano a 0: in questo caso non hai overflow. Vale per i numeri senza segno, per quelli con segno, l'ultimo bit (quello però più a sinistra) può valere 1, ovvero indicare che il numero è negativo.
wingman87
16-07-2011, 08:46
Intendi dire che, anche se il valore della variabile più grande è nel range, il valore non viene copiato correttamente se esso è negativo (per via del bit di segno)?
esatto, devo anche correggermi che il sistema di mettere il bit più a sinistra a 1 è parzialmente corretto, perchè di solito si usa il complemento a 2, un metodo di memorizazione dei valori un poco complicato a prima vista, ma che rende la somma di due numeri (indipendentemente se positivi o negativi) sempre una somma, altrimenti per ogni somma dovrebbe esserci qualche if aggiuntivo per dedicedere se il secondo dei dati è negativo di usare una sottrazione, se il primo si complica un poco di più... Insomma avresti un sacco di cai particolare = più codice da debuggare
pabloski
16-07-2011, 11:53
ciao volevo chiedere una cosa...quando salvo un dato vi è il vincolo di allineamento cioè la memoria è fatta in questo modo
0
4
8
12 ecc
quindi i dati vengono salvati in blocchi da 4 byte ma se io ad esempio ho una variabile di tipo int
e la trasformo in una short in tutti casi anche la variabile short occuperà 4 byte solo che potra contenere una valore più piccolo?
non confondere lo spazio di memoria riservato a determinati tipi di dato e l'allineamento
si tratta di due cose abbastanza diverse
ogni tipo di dato ha una sua specifica dimensione...short ad esempio è 16 bit, int è 32 bit, long è 64 bit, ecc....
tuttavia per motivi tecnici si procede ad allineare le variabili al word boundary e così abbiamo che nei processori a 32 bit si allinea a 32 bit e così via
in pratica significa mettere i dati nelle locazioni di memoria che sono multiple di 4 ( nel caso dei 32 bit )
ovviamente se costringi una short a prendersi 4 bytes, gli altri 2 bytes inutili dovranno essere messi a zero
quello che ottieni in sostanza è che la short sempre short è, ma fisicamente occupa 32 bit
cdimauro
16-07-2011, 12:06
ogni tipo di dato ha una sua specifica dimensione...short ad esempio è 16 bit, int è 32 bit, long è 64 bit, ecc....
Non è così. Dipende dall'ABI del sistema e/o compilatore.
pabloski
16-07-2011, 13:24
Non è così. Dipende dall'ABI del sistema e/o compilatore.
ovviamente il mio riferimento era a sistemi a 32 bit
gaiapuffo
16-07-2011, 14:00
un grazie di cuore per le risposte adesso ho capito
cdimauro
16-07-2011, 14:17
ovviamente il mio riferimento era a sistemi a 32 bit
E' lo stesso. Ci sono sistemi a 32 bit che hanno interi e long a 32 bit, e altri che definiscono questi ultimi a 64 bit.
pabloski
16-07-2011, 14:26
E' lo stesso. Ci sono sistemi a 32 bit che hanno interi e long a 32 bit, e altri che definiscono questi ultimi a 64 bit.
vabbè ma non posso stare a spiegare tutte le varianti che esistono
alla fin fine il thread riguarda l'allineamento per cui mi sono attenuto è quello che è lo standard
ad esempio linux 64 bit ha interi a 32 bit e imho è una cosa giustissima da fare
che poi ci siano differenze tra vari compilatore e sistemi è irrilevante ai fini di questo thread
cdimauro
16-07-2011, 14:38
Allora non scrivere cose che non sono corrette e parla soltanto di quello che attiene al thread. :fagiano:
pabloski
16-07-2011, 14:45
Allora non scrivere cose che non sono corrette e parla soltanto di quello che attiene al thread. :fagiano:
beh no, sono corrette
al limite ho omesso che ci sono strani compilatori che non giocano secondo le regole
p.s. trovo non standard il fatto di avere int a 64 bit e nessuno mi convincerà mai del contrario
cdimauro
16-07-2011, 15:55
Io mi riferivo ai long che hanno un comportamento diverso su sistemi sempre a 32 bit, che è un chiaro esempio di come non esistono rigide definizioni in merito.
Riguardo agli int a 64 bit, non è strano, ma anzi è logico. Vuol dire che si è preferito mappare la "word di macchina" dell'ISA con un int. Quindi ISA a 64 bit -> int a 64 bit.
In ogni caso se ometti queste cose, che sono estremamente importanti, l'informazione che fornisci non è corretta.
pabloski
16-07-2011, 17:05
In ogni caso se ometti queste cose, che sono estremamente importanti, l'informazione che fornisci non è corretta.
se il thread fosse relativo a quanto grossi sono i long e gli int avresti ragione
ma qui si tratta di spiegare in parole povere cos'è l'allineamento
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.