¿Qué pasa aquí? tamaño de (variable_int_corta + variable_char)

4 minutos de lectura

¿Que pasa aqui tamano de variable int corta variable char
dobladillo

#include <stdio.h>
 int main()        
{

           short int i = 20;

            char c = 97;

            printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i));
            return 0;
}

¿Alguien podría decirme qué sucede cuando sizeof (a + b) “a es de tipo int corto y b es de tipo char” La salida es: 2, 1, 4

  • sizeof es una construcción en tiempo de compilación.

    – Alok Guardar

    7 mayo 2013 a las 10:00

  • el tamaño del resultado se calcula como int

    – PIXY AZUL

    7 mayo 2013 a las 10:00

  • Todavía no mencionaste que sizeof(c+c) también dará 4, también lo hará sizeof(c/2) o sizeof(1998)

    – Kartikya

    7 mayo 2013 a las 10:27

¿Que pasa aqui tamano de variable int corta variable char
relajarse

Debido al estándar de C reglas integrales de promociónel tipo de expresión c + i es intpor eso obtienes el equivalente a sizeof (int).

Tenga en cuenta que sizeof no es una función, los paréntesis solo son necesarios para nombrar un tipo y para resolver conflictos de precedencia. Tu código podría estar escrito:

printf("%zu, %zu, %zu\n", sizeof i, sizeof c, sizeof (c + i));

El uso definitivo de sizeof tiene paréntesis desde sizeof se une más fuerte que +diciendo sizeof c + i sería analizado como (sizeof c) + i que no es el resultado deseado.

También tenga en cuenta que es una construcción en tiempo de compilación la mayor parte del tiempo, la expresión nunca se evalúa realmente. Todo lo que sucede es que el compilador “pretende” evaluarlo, averiguar el tipo de expresión y luego te da el tamaño de un valor de ese tipo. El valor real nunca necesita existir, lo que a veces es claro.

El tipo del valor devuelto por sizeof es size_tque se imprime utilizando %zu (que no es int).

  • Y como ya ha dicho en otra parte, para evitar confusiones, siempre ponga un espacio en blanco entre sizeof y el paréntesis de apertura. (Solo estoy haciendo explícita esta ingeniosa convención para el lector)

    – Rerito

    7 mayo 2013 a las 10:16

  • el código debe ser printf("%zu, %zu, %zu\n", sizeof i, sizeof c, sizeof (c + i)); porque sizeof no devuelve un int

    – phuclv

    4 de diciembre de 2017 a las 3:08


  • @LưuVĩnhPhúc Absolutamente, gracias por corregir esta respuesta anterior. Editado, por supuesto.

    – relajarse

    4 de diciembre de 2017 a las 8:47

1) sizeof(i) ==> sizeof(short int) = 2

2) sizeof(c) ==> sizeof(char) = 1

3) sizeof(c + i [97+20]) ==> sizeof(int) = 4 // result in constant value which is int as default 

  • “resulta en un valor constante que es int por defecto” – ¿Eh? Ni siquiera entiendo de qué estás hablando.

    – Christian Raú

    7 mayo 2013 a las 10:41


  • @ChristianRau Hablo de (c+i) que dan como resultado un valor constante que se toma como int por defecto.

    – Mani

    7 mayo 2013 a las 10:54

  • No sé, ¿por qué recibo votos negativos una y otra vez? Para mi english o ¿Estoy conduciendo a una respuesta incorrecta?

    – Mani

    7 mayo 2013 a las 10:56

  • Como no puedo descifrar la respuesta correctamente, no estoy seguro de si estás en el camino correcto. Pero tampoco parece que te estés refiriendo a las reglas de promoción integral (o al menos no lo expliques correctamente), así que desafortunadamente tengo que asumir lo peor.

    – Christian Raú

    7 mayo 2013 a las 11:56

  • c+i dar como resultado un valor constante (que de todos modos no es cierto) no tiene absolutamente nada que ver con eso. La explicación real de por qué es int es porque ambos operandos son promovidos a int antes de la suma y por lo tanto la suma tiene tipo inttambién (mira algunas de las otras respuestas).

    – Christian Raú

    7 mayo 2013 a las 12:02


Como han dicho otros, sizeof se calcula en tiempo de compilación.

Aquí, el valor de la expresión c + i entero, ya que c e i se promueven (promoción integral) a int y, por lo tanto,

sizeof( c + i )

te da 4 bytes en una máquina de 32 bits …

sizeof solo funciona en tiempo de compilación para obtener el tamaño de una expresión.

Lo siguiente en realidad no aumentará ‘c’:

c = tamaño de(++c);

La expresión sizeof(a + b) devolverá el tipo más grande con precedencia sin firmar

¿Que pasa aqui tamano de variable int corta variable char
Ali Bahraminezhad

El tipo de datos de a es “int corto”. -32768 ~ +32767

El tipo de datos de c es “char”. 0 ~ 255

Cuando agregas a a c tampoco lo es corto ni carbonizarsese vuelve En t!

Aquí hay un código de ejemplo que lo ayuda a obtener el tipo de datos variables:

#include <typeinfo>

int main()
{
    short int a = 1;
    char c="A";
    std::cout << typeid(a + c).name() << std::endl;

    return 1;
}

  • A short tiene el rango -32768 a 32767.

    – Lindydancer

    7 mayo 2013 a las 10:09

  • A short tiene el rango -32768 a 32767.

    – Lindydancer

    7 mayo 2013 a las 10:09

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad