Perché la dimensione del tipo di dati è diversa quando il valore viene passato direttamente all'operatore sizeof?


15
#include <stdio.h>
int main() {
    char a = 'A';
    int b = 90000;
    float c = 6.5;
    printf("%d ",sizeof(6.5));
    printf("%d ",sizeof(90000));
    printf("%d ",sizeof('A'));
    printf("%d ",sizeof(c));
    printf("%d ",sizeof(b));
    printf("%d",sizeof(a));
    return 0;
}

L'output è:

8 4 4 4 4 1

Perché l'output è diverso per gli stessi valori?


12
6.5non è un galleggiante, è undouble
NathanOliver il

printf("%d",sizeof(6.5f));per farlo a float.
Johnny Mopp,

2
"perché l'output è diverso qui?" perché dovrebbe essere lo stesso? Il fatto che sia possibile assegnare uno all'altro non significa che abbiano esattamente lo stesso tipo.
Slava,

5
L'identificatore di formato dovrebbe essere, ad esempio,printf("%zu", sizeof(6.5));
Weather Vane

Risposte:


9

Le costanti di carattere in C (opposto a C ++) hanno il tipo int. Quindi questa chiamata

printf("%d",sizeof('A'));

uscite 4. Questo sizeof( 'A' )è uguale a sizeof( int ).

Dallo standard C (6.4.4.4 Costanti di carattere)

10 Una costante di carattere intero ha tipo int ....

D'altra parte (6.5.3.4 La dimensione e l'allineamento degli operatori)

4 Quando sizeof viene applicato a un operando che ha tipo char, unsigned char, o char firmato (o una sua versione qualificata) il risultato è 1.

Quindi l'operando sizeofdell'operatore in questa espressione sizeof( 'A' )ha il tipo int mentre in questa espressione sizeof( a )dove a è dichiarato come

char a = 'A';

l'operando ha il tipo char.

Presta attenzione alle chiamate in questo modo

printf("%d",sizeof(6.5));

utilizzare un identificatore di formato di conversione errato. Devi scrivere

printf("%zu",sizeof(6.5));

Anche nella chiamata precedente viene utilizzata una costante del tipo doubledurante questa chiamata

printf("%zu",sizeof(c));

la variabile cha il tipo float.

È possibile ottenere lo stesso risultato per queste chiamate se la prima chiamata utilizzava una costante del tipo float come

printf("%zu",sizeof(6.5f));

19

Le costanti, come le variabili, hanno un proprio tipo:

  • 6.5 : Una costante a virgola mobile di tipo double
  • 90000: Una costante intera di tipo int(se intè 32 bit) o long(se intè 16 bit)
  • 'A' : Costante di carattere di tipo intin C e charin C ++

Le dimensioni che vengono stampate sono le dimensioni dei tipi precedenti.

Inoltre, il risultato sizeofdell'operatore ha tipo size_t. Quindi, quando si stampa l'identificatore di formato corretto da usare %zu, no %d.


1

Perché i valori non contano sizeof. È la dimensione dei tipi.

  • le costanti di carattere sono ints, non chars.

  • Le costanti in virgola mobile sono di default doubles a meno che non le si suffichi con fo l.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.