|
Appunti informatica |
|
Visite: 1419 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:L'i/o e la gestione dei fileL'I/O e la gestione dei file Per Input/Output (I/O) si intende l'insieme delle Allocazione dinamica della memoriaAllocazione dinamica della memoria Quando è dichiarata una variabile, il compilatore Operatori aritmeticiOperatori aritmetici Gli operatori aritmetici del C sono i simboli di addizione |
Gli operatori aritmetici del C sono i simboli di addizione (' '), sottrazione (' '), divisione (' ') e moltiplicazione (' '), quest'ultimo da non confondere con l'operatore di indirezione (pag. ) che utilizza il medesimo simbolo. Anche l'utilizzo di tali operatori appare piuttosto scontato; è comunque opportuno sottolineare che tra di essi valgono le normali regole di precedenza algebrica, per cui le operazioni di moltiplicazione e divisione si calcolano, in assenza di parentesi, prima di quelle di addizione e sottrazione. Così, ad esempio, l'espressione
a = b + c * 4 - d / 2;
è calcolata come
a = b + (c * 4) - (d / 2);
Vedere anche l'operatore di negazione algebrica, pag.
Quando si effettua una divisione tra due interi, il C restituisce solamente la parte intera del risultato. Se esiste un resto, questo è perso. Ad esempio, l'espressione
a = 14 / 3;
assegna ad a
Se interessa conoscere il resto della divisione, è necessario utilizzare l'operatore '
a = 14 % 3;
assegna ad a il valore , cioè il resto dell'operazione; in pratica, l'operatore ' ' è complementare all'operatore ' ', ma è applicabile esclusivamente tra valori rientranti nella categoria degli integral (pag.
Pur essendo classificato normalmente tra i linguaggi di alto livello, il C manifesta spesso la propria natura di linguaggio orientato al sistema: gli operatori su bit di cui dispone sono una delle caratteristiche che contribuiscono a renderlo particolarmente vicino alla macchina. Tali operatori consentono di agire sui dati integral considerandoli semplici sequenze di bit.
Particolarmente interessanti risultano due operatori che permettono di traslare, cioè di 'fare scorrere', di un certo numero di posizioni a destra o sinistra i bit di un valore: si tratta dei cosiddetti operatori di shift. In particolare, lo shift a sinistra si esprime col simbolo '<<', mentre quello a destra (indovinate un po') con '>>'. Esempio:
a = 1;
printf('%dn',a <<= 2);
printf('%dn',a >> 1);
Il frammento di codice riportato produce la visualizzazione dei numeri e ; infatti, il numero in forma binaria è . Traslando a sinistra i bit di due posizioni, si ottiene , che è, appunto, . Come si è detto a pag. , l'operatore di assegnamento può essere composto con gli operatori su bit: ne segue che la seconda riga di codice modifica il valore di a, assegnandole il suo stesso valore traslato a sinistra di due posizioni. La seconda chiamata a printf() visualizza il valore , restituito dall'espressione che trasla a destra di una posizione i bit del valore presente in a ( ), ma questa volta a non è modificata.
Va osservato che l'operazione di shift rende privi di significato i primi o gli ultimi bit del valore (a seconda che la traslazione avvenga verso sinistra o, rispettivamente, verso destra) : quegli spazi sono riempiti con bit di valore opportuno. Nel caso di shift a sinistra non vi è mai problema: i bit lasciati liberi sono riempiti con bit a zero; ma nel caso di uno shift a destra le cose si complicano.
Se l'integral su cui è effettuato lo shift è senza segno, o è signed ma positivo, allora anche in questo caso sono utilizzati bit nulli come riempitivo. Se, al contrario, l'integral è di tipo signed ed è negativo, allora va tenuto presente che il suo bit più significativo, cioè quello all'estrema sinistra, è usato proprio per esprimere il segno. Alcuni processori estendono il segno, cioè riempiono i bit lasciati liberi dallo shift con bit a uno; altri invece inseriscono comunque bit nulli. Pertanto, a seconda del calcolatore su cui è eseguita, una operazione di shift a sinistra come la seguente:
signed char sc;
sc = -1; // In bits e' 11111111
sc >>= 4; // rimane 11111111 con E.S.; diventa 00001111 senza E.S.
può avere quale effetto un valore finale per sc pari ancora a , se il processore effettua l'estensione del segno, oppure pari a se non vi è estensione di segno. Cautela, dunque: consultare la documentazione della macchina prima di azzardare ipotesi.
Detti bit, per farla breve, vengono 'spinti fuori' dallo spazio a loro disposizione e si perdono nel nulla.
L'estensione del segno dipende dal processore e non dal compilatore. Questo si limita infatti a utilizzare le istruzioni assembler di shift su bit per codificare opportunamente le istruzioni C che coinvolgono gli operatori di shift. Come è noto, ogni processore ha il 'proprio' assembler, pertanto il comportamento della macchina dipende dal significato che tali istruzioni assembly hanno per quel particolare processore. I processori Intel effettuano l'estensione del segno.
Appunti su: |
|