2010-02-12 14 views
42

Ho provatoIn C, perché sizeof (char) 1, quando 'a' è un int?

printf("%d, %d\n", sizeof(char), sizeof('c'));

e ottenuto 1, 4 come uscita. Se la dimensione di un personaggio è una, perché lo 'c' mi dà 4? Immagino sia perché è un numero intero. Quindi quando faccio char ch = 'c'; c'è una conversione implicita che sta avvenendo, sotto il cofano, da quel valore di 4 byte ad un valore di 1 byte quando è assegnato alla variabile char?

+3

ho credere che sia a che fare con la promozione automatica intero, qualcuno con più fatti di fede pubblicherà un fattuale risposta –

+2

@Roger: Egli chiede circa la differenza tra C e C++ sizeof ('a'), mentre ho chiesto se c'è una conversione in corso? Vedi il corpo della domanda. Ho già dedotto che 'a' è un numero intero in C. – legends2k

+0

Devo ringraziare "David Rodríguez - dribeas" per aver segnalato che il link nella mia risposta non è corretto. Sto cancellando la mia risposta. legends2k, la risposta corretta dovrebbe andare a Peter o Neil, a mio modesto parere. –

risposta

35

In C 'a' è una costante intera (!?!), Quindi 4 è corretta per la propria architettura. È implicitamente convertito in char per l'assegnazione. sizeof (char) è sempre 1 per definizione. Lo standard non dice quale unità 1 sia, ma è spesso byte.

+13

+ 1 per "ma è spesso byte", sto ancora ridacchiando :) –

+0

usato per essere un numero intero era di 2 byte .. lo standard non lo definisce neanche. – lexu

+0

Posso sapere la logica dietro lo standard che afferma 'sizeof (char)' dovrebbe sempre essere 1? È a causa della tabella ASCII con 256 caratteri? Cosa succede se in un'implementazione ho bisogno di avere di più, ad esempio unicode? – legends2k

0

Secondo gli standard ANSI C, un char viene promosso un int nel contesto in cui sono usati numeri interi, è stato utilizzato un identificatore di formato numero intero printf quindi i diversi valori. Un char è di solito 1 byte, ma questa è l'implementazione definita in base al runtime e al compilatore.

+5

Il formato intero riferito a sizeof ('a') not 'a' so I don ' Vediamo come questo argomento vale. –

+1

Lo standard C dice che un char letterale è di tipo int - ha sizeof int e nessuna promozione è coinvolta. –

+1

La tua risposta sembra suggerire che il compilatore C ispeziona una stringa di formato utilizzata da una funzione di libreria durante la compilazione di un programma, sei sicuro che sia così? –

7

Th C standard dice che un carattere letterale come 'a' è di tipo int, non di tipo char. Pertanto ha (sulla tua piattaforma) sizeof == 4. Vedi this question per una discussione più completa.

+0

Ho chiesto informazioni sulla promozione/fusione che accade tra i due tipi di dati, mentre la discussione/risposta non risponde a questo. – legends2k

+1

@ legends2K Hai chiesto "Se la dimensione di un personaggio è una, perché" c "mi dà 4?" Dato che questa risposta e la domanda che ho collegato spiegano che 'a' ha sizeof == 4, non c'è ovviamente alcun casting o promozione. –

+0

Bene. c'è una forma dettagliata della domanda, sotto di essa, che dice "c'è un evento di typecasting implicito, sotto il cofano, da quel valore di 4 byte ad un valore di 1 byte quando è assegnato alla variabile char". Anche questo fa parte di esso, credo. – legends2k

5

E 'il normale comportamento dell'operatore sizeof (Vedi Wikipedia):

  • Per un tipo di dati, sizeof restituisce la dimensione del tipo di dati. Per char, si ottiene 1.
  • Per un'espressione, sizeof restituisce la dimensione del tipo di variabile o espressione. Come un carattere letterale è tipizzata come int, si ottiene 4.
4

Questo argomento è trattato in ISO C11 6.4.4.4 Character constants anche se è in gran parte invariato dagli standard precedenti. Che afferma, nel paragrafo /10:

Una costante di carattere intero ha tipo int. Il valore di una costante di carattere intero contenente un singolo carattere associato a un carattere di esecuzione a byte singolo è il valore numerico della rappresentazione del carattere mappato interpretato come un numero intero.

+0

+1 grazie per aver citato lo standard; Mi chiedo perché _integer carattere constant_ è stato scelto su _character constant_. – legends2k

Problemi correlati