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?

js
la source
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));
Vlad de Moscou
la source
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.

dbush
la source
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.

SS Anne
la source