Elaboratore 32 bit
Ciao a tutti! Vorrei capire quali sono le dimensioni di alcune variabili e delle costanti in un elaboratore a 32 bit. cosa cambia con quelli a 16 o 64 bit?
Ecco la lista delle variabili:
int v[4]
0
'\0'
"0"
float a
double b
Grazie per l'aiuto!
Ecco la lista delle variabili:
int v[4]
0
'\0'
"0"
float a
double b
Grazie per l'aiuto!
Risposte
Dipende dal compilatore.
"vict85":
Dipende dal compilatore.
L'esercizio dice: Prendendo come riferimento un elaboratore a 32 bit, scrivere le dimensioni in byte delle seguenti variabili e costanti. come devo fare?
Lo standard C definisce solo delle dimensioni minime per i tipi di base come int. Ogni compilatore è libero di scegliere quale dimensione preferisce usare. La risposta a questa domanda è quindi in realtà impossibile senza dare informazioni aggiuntive sull'architettura e il compilatore che si sta usando. Supponendo che il tuo professore si stia riferendo ad una architettura x86 e che si stia lavorando con i più comuni compilatori per tale architettura (e sui diversi sistemi operativi), possiamo comunque abbastanza supporre che la dimensione di un int sia 32 bit (su architettura a 16 bit è spesso 16 bit, mentre su una a 64 bit rimane spesso di 32 bit). float e double sono più standard rispetto alle variabili intere e sono sempre rispettivamente di 32 e 64 bit. Nella quasi totalità delle architetture sono i tipi a singola e doppia precisione secondo lo standard IEEE754. Venendo alle costanti:
- 0 è una costante intera (per cui occupa 32 bit).
- '\0' è in realtà una variabile intera come nel caso precedente. Ma un compilatore potrebbe decidere di usarne solo uno di byte. In pratica entrambi le costanti occuperanno 0 byte perché ci sono istruzioni particolari per gestire lo zero.
- "0" è una stringa di due byte.
Si tratta insomma di qualcosa di molto più complicato di quello che il tuo professore vi avrà probabilmente spiegato.
- 0 è una costante intera (per cui occupa 32 bit).
- '\0' è in realtà una variabile intera come nel caso precedente. Ma un compilatore potrebbe decidere di usarne solo uno di byte. In pratica entrambi le costanti occuperanno 0 byte perché ci sono istruzioni particolari per gestire lo zero.
- "0" è una stringa di due byte.
Si tratta insomma di qualcosa di molto più complicato di quello che il tuo professore vi avrà probabilmente spiegato.
Ad esempio in c questo banale programma ti stampa le dimensioni in bytes
Inoltre se sei su macchina a 64 bit lo puoi compilare come eseguibile a 32 bit con l'opsione
#include <stdio.h> int main(){ char ch = '\0'; char str[2] = "0"; printf("sizeof int: %d\n",sizeof(int)); printf("sizeof \\0: %d\n", sizeof(ch)); printf("sizeof \"0\": %d\n", sizeof(str)); printf("sizeof float: %d\n",sizeof(float)); printf("sizeof double: %d\n",sizeof(double)); }
Inoltre se sei su macchina a 64 bit lo puoi compilare come eseguibile a 32 bit con l'opsione
-m32di
gcc. Se lo fai in entrambi i modi, vedrai che non cambia niente tra le due versioni.
@Cronovirus: Il tuo codice non calcola correttamente '0'. Lo standard afferma infatti che '0' è una costante intera (int), ma nel tuo caso la stai assegnando a ch (una variabile char). Usando infatti il seguente codice:
ottengo il seguente output:
#include <stdio.h> int main(void) { char c = '0'; printf("sizeof(c) = %u\n", sizeof(c)); printf("sizeof('0') = %u\n", sizeof('0')); return 0; }
ottengo il seguente output:
sizeof(c) = 1 sizeof('0') = 4