¿Por qué el tamaño del tipo de datos es diferente cuando el valor se pasa directamente al 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;
}

El resultado es:

8 4 4 4 4 1

¿Por qué la salida es diferente para los mismos valores?

js
fuente
12
6.5no es un flotador, es undouble
NathanOliver
printf("%d",sizeof(6.5f));para hacerlo a float.
Johnny Mopp
2
"¿Por qué la salida es diferente aquí?" ¿Por qué debería ser lo mismo? El hecho de que pueda asignarse uno a otro no significa que tengan exactamente el mismo tipo.
Slava
55
El especificador de formato debe ser, por ejemplo,printf("%zu", sizeof(6.5));
Weather Vane

Respuestas:

9

Las constantes de caracteres en C (opuesto a C ++) tienen el tipo int. Entonces esta llamada

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

salidas 4. Eso sizeof( 'A' )es igual a sizeof( int ).

Del estándar C (6.4.4.4 Constantes de caracteres)

10 Una constante de carácter entero tiene el tipo int ....

Por otro lado (6.5.3.4 Los operadores sizeof y alignof)

4 Cuando sizeof se aplica a un operando que tiene el tipo char, unsigned char oigned char, (o una versión calificada del mismo) el resultado es 1.

Entonces, el operando del sizeofoperador en esta expresión sizeof( 'A' )tiene el tipo int, mientras que en esta expresión sizeof( a )donde a se declara como

char a = 'A';

El operando tiene el tipo char.

Presta atención a esas llamadas como esta

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

utiliza un especificador de formato de conversión incorrecto. Tu tienes que escribir

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

También en la llamada anterior se usa una constante del tipo doublemientras que en esta llamada

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

La variable ctiene el tipo float.

Podría obtener el mismo resultado para estas llamadas si la primera llamada usara una constante del tipo float como

printf("%zu",sizeof(6.5f));
Vlad de Moscú
fuente
19

Las constantes, como las variables, tienen un tipo propio:

  • 6.5 : Una constante de tipo flotante double
  • 90000: Una constante de tipo entero int(si intes de 32 bits) o long(si intes de 16 bits)
  • 'A' : Una constante de caracteres de tipo inten C y charen C ++

Los tamaños que se imprimen son los tamaños de los tipos anteriores.

Además, el resultado del sizeofoperador tiene tipo size_t. Entonces, al imprimir el especificador de formato adecuado para usar %zu, no lo es %d.

dbush
fuente
1

Porque los valores no importan sizeof. Es el tamaño de los tipos.

  • las constantes de caracteres son ints, no chars.

  • las constantes de punto flotante son por defecto doubles a menos que las sufijas con fo l.

SS Anne
fuente