tipos datos data bytes c types int short

c - datos - unsigned int



Rompecabezas por tipo C promociĆ³n de corto a int (3)

Tengo una pregunta que necesita orientación de cualquier experto:

  1. Como un valor con tipo short se pasa como argumento a la printf() , se promocionará automáticamente a tipo int , por eso la printf() verá el valor como tipo int lugar de tipo short .

  2. Entonces, básicamente, el tipo short tiene 16 bits de ancho, que es 0000000000000000 mientras que el tipo int tiene 32 bits de ancho, que es 00000000000000000000000000000000 .

  3. Digamos que declaro un número de llamada variable con tipo short e inicializo con un valor de -32, lo que significa que los bits más significativos del tipo short serán 1 , que es 0000000011100000 .

  4. Cuando paso este valor a printf() , se convertirá a tipo int , por lo que se convertirá en 00000000000000000000000011100000 .

  5. En el paso 4, cuando se convierte a int , el bit más significativo es 0 .

  6. ¿Por qué, cuando uso el especificador %hd o incluso el especificador %d , ¿seguirá apareciendo un valor negativo en lugar de un valor positivo?


Como dices, se convierte y la conversión en este caso implica conocimiento. Es decir, el compilador sabe cómo se firmó el trabajo de conversión de corto a int. No solo agrega bits al frente, sino que crea un nuevo int con el mismo valor que el corto. Es por eso que obtienes el número correcto.


La conversión de un short a un int básicamente replica el bit más significativo del short en los 16 bits superiores del int. Esta es la razón por la cual el int se imprime como negativo. Si no quieres este comportamiento usando un ushort .


No, short e int son ambos tipos firmados, por lo que se promociona mediante extensión de signo y no con relleno de 0 bytes:

-32 short = 11111111 11100000 -32 int = 11111111 11111111 11111111 11100000

dejando el MSB como 1, es decir, negativo.

Puede falsificar el comportamiento que espera al convertirlo sin firmar primero, por ejemplo

printf("%d", (unsigned short)((short)(-32)));