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:
Como un valor con tipo
short
se pasa como argumento a laprintf()
, se promocionará automáticamente a tipoint
, por eso laprintf()
verá el valor como tipoint
lugar de tiposhort
.Entonces, básicamente, el tipo
short
tiene 16 bits de ancho, que es0000000000000000
mientras que el tipoint
tiene 32 bits de ancho, que es00000000000000000000000000000000
.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 tiposhort
serán1
, que es0000000011100000
.Cuando paso este valor a
printf()
, se convertirá a tipoint
, por lo que se convertirá en00000000000000000000000011100000
.En el paso 4, cuando se convierte a
int
, el bit más significativo es0
.¿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)));