Pourquoi la taille du type de données est-elle différente lorsque la valeur est directement transmise à l'opérateur 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;
}

La sortie est:

8 4 4 4 4 1

Pourquoi la sortie est-elle différente pour les mêmes valeurs?


12
6.5n'est pas un flotteur, c'est undouble
NathanOliver

printf("%d",sizeof(6.5f));pour en faire un float.
Johnny Mopp

2
"pourquoi la sortie est différente ici?" pourquoi devrait-il en être de même? Le fait que vous puissiez les affecter les uns aux autres ne signifie pas qu'ils ont exactement le même type.
Slava

5
Le spécificateur de format doit être, par exemple,printf("%zu", sizeof(6.5));
Weather Vane

Réponses:


9

Les constantes de caractères en C (opposées à C ++) ont le type int. Donc cet appel

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

sorties 4. C'est sizeof( 'A' )égal à sizeof( int ).

De la norme C (6.4.4.4 Constantes de caractères)

10 Une constante de caractère entier a le type int ....

En revanche (6.5.3.4 Les opérateurs sizeof et alignof)

4 Lorsque sizeof est appliqué à un opérande de type char, char non signé ou char signé (ou une version qualifiée de celui-ci), le résultat est 1.

Ainsi, l'opérande de l' sizeofopérateur dans cette expression sizeof( 'A' )a le type int tandis que dans cette expression sizeof( a )où a est déclaré comme

char a = 'A';

l'opérande a le type char.

Faites attention à ces appels comme celui-ci

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

utilisez un spécificateur de format de conversion incorrect. Vous devez écrire

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

Dans l'appel ci-dessus, une constante du type est utilisée doublelors de cet appel

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

la variable ca le type float.

Vous pouvez obtenir le même résultat pour ces appels si le premier appel utilise une constante de type float comme

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

19

Les constantes, comme les variables, ont un type qui leur est propre:

  • 6.5 : Une constante à virgule flottante de type double
  • 90000: Une constante entière de type int(si intest 32 bits) ou long(si intest 16 bits)
  • 'A' : Une constante de caractère de type inten C et charen C ++

Les tailles imprimées sont les tailles des types ci-dessus.

De plus, le résultat de l' sizeofopérateur est de type size_t. Donc, lors de l'impression, le spécificateur de format approprié à utiliser ne l'est %zupas %d.


1

Parce que les valeurs ne comptent pas sizeof. C'est la taille des types.

  • les constantes de caractère sont ints, pas chars.

  • les constantes à virgule flottante sont par défaut doubles sauf si vous les suffixez avec fou l.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.