Dlaczego rozmiar typu danych różni się, gdy wartość jest przekazywana bezpośrednio do operatora 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;
}

Dane wyjściowe to:

8 4 4 4 4 1

Dlaczego dane wyjściowe są różne dla tych samych wartości?

js
źródło
12
6.5to nie jest pływak, todouble
NathanOliver,
printf("%d",sizeof(6.5f));zrobić to float.
Johnny Mopp,
2
„dlaczego wyniki różnią się tutaj?” dlaczego powinno być tak samo? Fakt, że można przypisać jeden do drugiego, nie oznacza, że ​​mają one dokładnie ten sam typ.
Slava
5
Specyfikatorem formatu powinna być na przykład:printf("%zu", sizeof(6.5));
Wiatrowskaz

Odpowiedzi:

9

Stałe znakowe w C (przeciwne do C ++) mają typ int. Więc to połączenie

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

wyjścia 4. To sizeof( 'A' )jest równe sizeof( int ).

Ze standardu C (6.4.4.4 Stałe znaków)

10 Stała znakowa liczby całkowitej ma typ int ....

Z drugiej strony (6.5.3.4 Wielkość i wyrównanie operatorów)

4 Po zastosowaniu sizeof do argumentu typu char, unsigned char lub podpisanego char (lub jego wersji kwalifikowanej) wynik wynosi 1.

Tak więc operand sizeofoperatora w tym wyrażeniu sizeof( 'A' )ma typ int, podczas gdy w tym wyrażeniu, sizeof( a )gdzie a jest zadeklarowane jak

char a = 'A';

operand ma typ char.

Zwróć uwagę na takie połączenia

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

użyj niepoprawnego specyfikatora formatu konwersji. Musisz pisać

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

Również w powyższym wywołaniu używana jest stała tego typu doublepodczas tego wywołania

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

zmienna cma typ float.

Możesz uzyskać taki sam wynik dla tych wywołań, jeśli pierwsze wywołanie użyje stałej typu float jak

printf("%zu",sizeof(6.5f));
Vlad z Moskwy
źródło
19

Stałe, podobnie jak zmienne, mają swój własny typ:

  • 6.5 : Stała zmiennoprzecinkowa typu double
  • 90000: Stała typu całkowitego int(jeśli intwynosi 32 bity) lub long(jeśli intwynosi 16 bitów)
  • 'A' : Stała znakowa typu intw C i charC ++

Rozmiary, które są drukowane, są rozmiarami powyższych typów.

Wynik sizeofoperatora ma również typ size_t. Tak więc podczas drukowania odpowiedniego specyfikatora formatu do użycia %zunie jest %d.

dbush
źródło
1

Ponieważ wartości nie mają znaczenia sizeof. To rozmiar typów.

  • stałe znakowe to ints, chara nie s.

  • stałe zmiennoprzecinkowe są domyślnie doubles, chyba że dodasz je za pomocą flub l.

SS Anne
źródło