Tengo el siguiente programa
#include <stdio.h>
int main(void)
{
unsigned short int length = 10;
printf("Enter length : ");
scanf("%u", &length);
printf("value is %u \n", length);
return 0;
}
Que cuando se compila utilizando gcc filename.cemitió la siguiente advertencia (en la scanf()línea).
warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]
Entonces me he referido al C99 specification - 7.19.6 Formatted input/output functionsy no podía entender el especificador de formato correcto al utilizar los modificadores de longitud (como short, long, etc.) con el unsignedde inttipo de datos.
¿Es %uel especificador correcto unsigned short int? Si es así, ¿por qué recibo la advertencia mencionada anteriormente?
EDITAR: La mayoría de las veces, lo intentaba %uhy todavía daba la advertencia.

printf("%u\n", (unsigned int)length); //siempre funciona, ya que la especificación C99 que lees garantiza esosizeof(short) <= sizeof(int)(pero las respuestas reales a esta pregunta a continuación son, por supuesto, mucho mejores)Respuestas:
Intenta usar el
"%h"modificador:fuente
Para
scanf, debe usar%huya que está pasando un puntero a ununsigned short. Paraprintf, es imposible pasar ununsigned shortdebido a las promociones predeterminadas (se promocionará a,intounsigned intdependiendo de siinttiene al menos tantos bits de valor comounsigned shorto no),%do%uestá bien. Sin%huembargo, puedes usarlo si lo prefieres.fuente
Desde la página del manual de Linux:
h Una siguiente conversión de entero corresponde a un argumento int corto o int corto sin signo, o un siguiente lowing n conversion corresponde a un puntero a un argumento int corto.Entonces, para imprimir un entero corto sin signo, la cadena de formato debe ser
"%hu".fuente
Aquí hay una buena tabla para
printfespecificadores. Entonces debería ser%huparaunsigned short int.Y enlace a Wikipedia "tipos de datos C" también.
fuente