Domande & Risposte
Cos’è un compilatore?
Un compilatore è un software. Si occupa di tradurre del codice sorgente in codice eseguibile.
Qual è la differenza tra codice sorgente e codice eseguibile?
Il codice sorgente è del codice scritto in un linguaggio di programmazione a scelta (ad esempio, C). Il codice sorgente è comprensibile per un programmatore umano, incomprensibile per un computer.
Il codice macchina - anche detto codice eseguibile - è del codice scritto in binario, comprensibile dal computer.
Informatica 101: che differenza c’è tra bit e byte?
Un byte è costituito da 8 bit. Ergo, “byte” e “bit” non sono sinonimi (!!!).
Da cosa è caratterizzata una variabile nel linguaggio C?
Nel linguaggio C, una variabile è caratterizzata da:
-
un identificatore, ovvero un nome con il quale, all’interno del codice sorgente, si fa riferimento a quella variabile. L’identificatore deve essere univoco: non possono esserci due variabili aventi lo stesso identificatore.
-
un tipo: serve tra l’altro a definire quanto spazio la variabile occupa in memoria. Serve anche per altro, ma ora come ora lascio stare.
-
un indirizzo in memoria, ovvero il numero della prima cella della memoria RAM occupato dalla variabile. L’indirizzo in memoria non può essere scelto dal programmatore. Inoltre, può cambiare a ogni esecuzione del programma. Posso osservare l’indirizzo in memoria di una variabile precedendo il suo nome con il simbolo
&. -
un valore, ovvero un ‘qualcosa’ scritto all’interno dello spazio di memoria riservato alla variabile.
Notare che le istruzioni di dichiarazione servono a fissare l’identificatore, il tipo e l’indirizzo in memoria di una variabile, ma non ne definiscono il valore. Quali istruzioni posso definire o modificare il valore di una variabile?
Qual è la differenza tra i termini assegnazione e inizializzazione?
L’assegnazione è l’operazione con cui si attribuisce un valore a una variabile. La prima assegnazione di valore a una variabile è più propriamente detta inizializzazione (della variabile).
Se, nel linguaggio C, eseguo l’istruzione int a = 10;, a cosa mi riferisco scrivendo a? A cosa mi riferisco scrivendo &a?
La scrittura a fa riferimento al valore contenuto nella variabile con identificatore a. Ovvero, nell’esempio: 10.
La scrittura &a fa riferimento all’indirizzo in memoria in cui la variabile identificata come a è salvata durante l’esecuzione del programma.
Costruisci una tabella in cui, per ogni tipo di dato del linguaggio C da te conosciuto, indichi il numero di byte tipicamente occupato nella memoria di un sistema a 64 bit.*
| Tipo di variabile | Byte occupati su sistemi x64 |
|---|---|
| short int | 2 |
| int | 4 |
| long int | 8 |
| unsigned short int | 2 |
| unsigned int | 4 |
| unsigned long int | 8 |
| float | 4 |
| double | 8 |
| long double | 16 |
| char | 1 |
| bool | 1 |
Nel linguaggio C, quale differenza c’è, ad esempio, tra i tipi int e unsigned int?*
I tipi di variabile int e unsigned int occupano entrambi lo stesso spazio in memoria: tipicamente, su un sistema a 64 bit, entrambi occupano 4 byte (== 32 bit) di spazio.
Tuttavia, int si può utilizzare per rappresentare valori interi sia positivi sia negativi (all’incirca nell’intervallo [-231, 231), mentre unsigned int si può utilizzare per rappresentare solo valori non negativi (all’incirca nell’intervallo [0, 232]).
Nel linguaggio C, come posso conoscere il numero di byte occupato da una variabile?
Puoi usare la funzione sizeof(). Inserendo tra le parentesi tonde l’identificatore a, otterrai il numero di byte occupati dalla variabile a. Ovviamente, essa deve essere dichiarata prima di poter utilizzare sizeof(a) 😇
Qui trovi un programma C con il quale puoi vedere il numero di byte occupato dai principali tipi di variabile sul tuo computer.
Prof., può farmi una tabella in cui, per ogni tipo del linguaggio C, indica lo specificatore di conversione da usare?
Ecco qui:
| Tipo | Specificatore di conversione |
|---|---|
| short int | %hd |
| int | %d |
| long int | %ld |
| unsigned short int | %hu |
| unsigned int | %u |
| unsigned long int | %lu |
| float | %f |
| double | %lf |
| long double | %Lf |
| char | %c |
Prof., può farmi una tabella in cui, per ogni tipo intero del linguaggio C, mi indica il valore minimo e il valore massimo che esso può custodire? Così, se mi capita di ottenere numeri privi di senso, posso vedere se il problema sta nel non aver rispettato questi limiti!
Ecco qui. La tabella riporta i valori minimi e massimi sul mio computer, ma probabilmente sono gli stessi del tuo. Comunque, puoi verificare i tuoi esatti limiti utilizzando questo programma C.
| Tipo | Minimo | Massimo |
|---|---|---|
| short int | -32768 | 32767 |
| int | -2147483648 | 2147483647 |
| long int | -9223372036854775808 | 9223372036854775807 |
| unsigned short int | 0 | 65535 |
| unsigned int | 0 | 4294967295 |
| unsigned long int | 0 | 18446744073709551615 |
Prof., come faccio a calcolare la radice quadrata di un numero?
La radice quadrata di un numero, nel linguaggio C, si calcola utilizzando la funzione sqrt(). Ad esempio, l’istruzione sqrt(10) restituisce come risultato la radice quadrata di 10.
Per poter utilizzare la funzione sqrt(), è dapprima necessario importare nel nostro file la libreria di funzioni math.h. In altri termini, in cima al nostro file, dobbiamo aggiungere l’istruzione:
#include <math.h>
Ma non finisce qui! Quando compiliamo il file, in fondo al comando gcc ... dobbiamo lasciare uno spazio e scrivere -lm. Per esempio, se il nostro file C si chiama es07.c, il comando per la compilazione apparirà così:
gcc es07.c -o es07 -lm
A questo punto, la funzione sqrt() sarà riconosciuta, il file eseguibile creato, e potrete calcolare la radice quadrata di un numero 😊