2012-03-04 10 views
26

Di seguito da un test di programmazione "fill-in a casa" che è parte del processo di applicazione per un Master in sviluppo del gioco in un'università del Regno Unito:Di int, char, float e bool, che è il più piccolo?

C++ Fondamenti

Se un programma dichiarato quattro variabili, uno di tipo int, uno di tipo float, uno di tipo char, e uno di tipo bool, quale variabile occuperebbe il almeno spazio nella memoria?

  1. int
  2. char
  3. galleggiante
  4. bool

Secondo le istruzioni, c'è solo una vera dichiarazione. Tuttavia, il mio libro C++ (C++ Pocket Reference, O'Reilly) afferma: "La dimensione tipica di un bool è un byte" e "La dimensione di un char è di un byte. La dimensione di un byte tecnicamente è definita dall'implementazione, ma raramente è tutto tranne otto bit. "

Sono frainteso qualcosa qui? Quale risposta vorresti inserire e perché?

+13

L'analisi è corretta. La domanda è mal posta. – ruakh

+0

Poiché la comprensione è più importante di un cerchio sulla carta, spiegare la risposta corretta per iscritto. – tenfour

+4

'5. né // fill' – Xeo

risposta

2

La lingua non specifica alcuna relazione tra queste dimensioni di testo che garantisce una risposta corretta a tale domanda come posta. Potrebbero essere tutti tipi a 32 bit, per esempio.

+0

Lo fa. Sebbene la dimensione esatta non sia specificata, è garantito che 'char' non sarà più grande delle altre. Quindi esiste una risposta per questa domanda. – vsz

+0

Sì, quindi potrebbero essere tutti della stessa dimensione, nel senso che occuperebbero la stessa quantità di spazio in memeory. La domanda non specifica l'ambiente, quindi non è responsabile. Il 'char' sarà sempre il minimo, indipendentemente dall'ambiente, ma gli altri potrebbero essere tutti uguali. –

+0

Qual è il più piccolo da questo elenco> 5, 2, 3, 2, 2, 4? Puoi dire che non c'è risposta, o forse è meglio dire che 2 è il più piccolo, anche se non è il solo a essere il più piccolo? – vsz

0

sizeof (bool) è definito dall'implementazione.

Is sizeof(bool) defined?

Vale a dire, non richiesto essere solo un singolo byte è.

+2

L'unico che deve essere un singolo byte è 'char'. Ma tutti gli altri potrebbero avere anche la dimensione 1. –

0

La risposta corretta è booleana in teoria, in quanto un char richiede una conoscenza di almeno 8 bit, mentre un bool richiede tecnicamente solo un bit. potresti distruggere 8 bool all'interno di un singolo char se vuoi in teoria.

+1

Non secondo le specifiche della lingua, non è possibile. Un singolo 'bool' avrebbe comunque dimensione' 1' al minimo. –

+0

@CarlNorum: Anche se IIRC, 'std :: vector ' è specializzato come bit-string, un bit per elemento. (O è per questo che hai specificato "un singolo' bool' "?) – ruakh

+5

È una domanda su una lingua particolare, non su una lingua teorica. –

32

Nessun tipo accetta meno rispetto a char, perché per definizione sizeof(char) == 1. Tuttavia, è del tutto possibile che tutti i tipi assumano lo stesso spazio.

(Rappresentando ogni tipo con 16 bit (con un formato opportunamente inusuale virgola mobile) sarebbe sufficiente a soddisfare le esigenze del campo di valori standard;. Hardware reale dove ogni tipo ha 32 bit esiste)

+0

Ok, taccio le mie parole. La documentazione sul valore di ritorno probabilmente spiega che ... –

+1

@KerrekSB: ho visto che di recente ho discusso, e non sono riuscito a trovare nulla nelle specifiche che dicano "unità fondamentale indirizzabile di memoria/macchina"; invece la specifica diceva "ogni byte deve avere un indirizzo univoco", che consentirebbe una "emulazione" a 8 bit dove 16 bit è l'unità indirizzabile minima (hardware). Puoi trovarmi un po 'nelle specifiche per sostenerlo? –

+0

@MooingDuck, 1.7 "Modello di memoria C++", paragrafo 1. I byte devono essere contigui, devono essere almeno di 8 bit. "Macchina" è in realtà la macchina astratta, tuttavia l'hardware sottostante può essere diverso. –

0

Il tipico la dimensione di un bool corrisponde a un byte. non significa it sempre è un byte. La domanda si riferisce a una realizzazione che non ha dimensioni di un byte bool o implica che solo una variabile ha una dimensione minore.

+0

Si noti che un 'bool' non può essere più piccolo di un' char'/byte. –

+0

@MooingDuck: quale sezione dello standard ci dice che? –

+0

@TomWijsman Lo standard afferma che sizeof (char) == 1. Poiché sizeof (t) è integrale, nessun tipo può essere più piccolo. – Tarmil

10

Se un programma dichiarate quattro variabili, uno di tipo int, uno di tipo galleggiante, uno di tipo char, e uno di tipo bool, quale variabile sarebbe occupare lo spazio minimo in memoria?

Il vero problema con la domanda con il tuo hanno inviato le bugie con queste parole:

occupy ... space in memory

Se l'interpretazione è da assumere, quindi nella maggior parte dei casi si assumerebbe una delle attuali compilatori popolari nel qual caso rispondere a 2 e 4 occuperebbero entrambi il minimo spazio in memoria. Semplicemente perché gli attuali compilatori popolari rendono il char e bool occupano un singolo byte in memoria ...

Come indicato nei commenti, sizeof() is of type size_t, which is integral.

Come sizeof(char) == 1 è sempre vero secondo lo standard, e il valore è solidale; nessun altro sizeof(T) può essere inferiore a 1. Ma qualsiasi altro T di char può essere più grande di 1 dipendente dall'implementazione. Poiché non è possibile presumere che il numero sizeof(char) == sizeof(bool) sia sempre valido, si può almeno presupporre che lo sizeof(char) <= sizeof(bool) sia valido.

che rende sizeof(char) essendo la meno la risposta più corretta ...

+0

Se insiste, dovresti prendere 'char'. Come Kerrek SB indica nella sua risposta, è l'unico che ha una dimensione di 1. Un bool può essere più grande di quello. –

+0

No, non può. È per definizione nello standard. 'sizeof (char) == 1'. Poiché la dimensione è sempre integrale, un bool non può essere inferiore a 1. –

+0

5.3.3.-1: _ "sizeof (char), sizeof (char firmato) e sizeof (char unsigned) sono 1" _ –

2

Il C++ standard fornisce seguenti relazioni:

sizeof(char) == 1 
sizeof(char) <= sizeof(int) <= sizeof(long) 
sizeof(float) <= sizeof(double) 

...

+0

Quale sezione dello standard o Stroustrup lo menziona? Questo tuttavia non copre 'sizeof (bool)' ... –

1

Non v'è alcuna garanzia per il dimensione esatta di questi tipi, ma c'è una garanzia, che il char non è più grande del corto, e il corto non è più grande del lungo.

Quindi, il carbone occuperà sempre la minor quantità di memoria, ma potrebbe non essere l'unico a farlo. È ancora garantito che nient'altro avrà una dimensione più piccola.

Potrebbe esserci un'eccezione con bool, tuttavia, su alcuni microcontrollori integrati speciali. Possono avere una variabile bit, che richiede esattamente un bit, tuttavia, non sono nella RAM ma in registri speciali.

Tuttavia, a meno che la vostra architettura e compilatore sono particolarmente strano o inusuale, si può reasonalbly aspettare che char è 1, short è 2, long è 4, long long è 8 e int è 2 o 4, ma di solito lungo 4 byte .

4

La risposta è char. Nessuna altra risposta è corretta.

(Anche se sono d'accordo che la domanda avrebbe dovuto essere formulata meglio).

Il C++ 03 standard $ 5.3.3/1 dice:

sizeof (char), sizeof (char firmato) e sizeof (unsigned char) sono 1; il risultato di sizeof applicato a qualsiasi altro tipo fondamentale (3.9.1) è definito dall'implementazione . [Nota: in particolare, sizeof (bool) e sizeof (wchar_t) sono implementazione-defined.69)

(trovato questa informazione da un'altra domanda: Why the sizeof(bool) is not defined to be one, by the Standard itself?).

Dato che la dimensione minima è 1 (sizeof deve restituire valori interi), ciò significa che il seguente sarà vero in qualsiasi attuazione che segue gli standard:

sizeof(char) == 1 
sizeof(bool) >= 1 
sizeof(int) >= 1 
sizeof(float) >= 1 

La domanda era mal formulata e probabilmente avrebbe dovuto essere chiesto più chiaramente come "... quale variabile occuperebbe necessariamente non più spazio nella memoria di qualsiasi altro (in qualsiasi implementazione standard di C++ ben educata)?"

Problemi correlati