Por que o tamanho do tipo de dados é diferente quando o valor é passado diretamente para o operador 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;
}

A saída é:

8 4 4 4 4 1

Por que a saída é diferente para os mesmos valores?

js
fonte
12
6.5não é um flutuador, é umdouble
NathanOliver
printf("%d",sizeof(6.5f));para fazer isso float.
Johnny Mopp
2
"por que a saída é diferente aqui?" por que deveria ser o mesmo? O fato de poder atribuir um ao outro não significa que eles tenham exatamente o mesmo tipo.
Slava
5
O especificador de formato deve ser, por exemplo,printf("%zu", sizeof(6.5));
Weather Cane

Respostas:

9

Constantes de caracteres em C (opostos para C ++) tem o tipo int. Então esta ligação

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

saídas 4. Isso sizeof( 'A' )é igual a sizeof( int ).

Do padrão C (6.4.4.4 Constantes de caracteres)

10 Uma constante de caractere inteiro tem o tipo int ....

Por outro lado (6.5.3.4 O tamanho e o alinhamento dos operadores)

4 Quando sizeof é aplicado a um operando que possui o tipo char, char não assinado ou char assinado (ou uma versão qualificada), o resultado é 1.

Portanto, o operando do sizeofoperador nesta expressão sizeof( 'A' )tem o tipo int enquanto nesta expressão em sizeof( a )que a é declarado como

char a = 'A';

o operando tem o tipo char .

Preste atenção a chamadas assim

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

use especificador de formato de conversão incorreto. Você tem que escrever

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

Também na chamada acima, é usada uma constante do tipo doubleenquanto nesta chamada

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

a variável ctem o tipo float.

Você poderia obter o mesmo resultado para essas chamadas se a primeira chamada usasse uma constante do tipo float como

printf("%zu",sizeof(6.5f));
Vlad de Moscou
fonte
19

Constantes, como variáveis, têm um tipo próprio:

  • 6.5 : Uma constante de ponto flutuante do tipo double
  • 90000: Uma constante inteira do tipo int(se intfor 32 bits) ou long(seint for 16 bits)
  • 'A' : Uma constante de caractere do tipo intem C e charem C ++

Os tamanhos impressos são os tamanhos dos tipos acima.

Além disso, o resultado do sizeofoperador tem tipo size_t. Portanto, ao imprimir o especificador de formato adequado a ser utilizado %zu, não %d.

dbush
fonte
1

Porque os valores não importam sizeof. É o tamanho dos tipos.

  • constantes de caracteres são ints, não chars.

  • constantes de ponto flutuante são por padrão doubles, a menos que você as sufixe com fou l.

SS Anne
fonte