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 usando gcc filename.c
emitió la siguiente advertencia (en el scanf()
línea).
warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]
Entonces refiero el C99 specification - 7.19.6 Formatted input/output functions
y no podía entender el especificador de formato correcto al usar los modificadores de longitud (como short
, long
etc) con unsigned
por int
tipo de datos.
Es %u
el especificador correcto unsigned short int
? Si es así, ¿por qué recibo la advertencia mencionada anteriormente?
EDITAR: La mayor parte del tiempo, estaba intentando %uh
y todavía estaba dando la advertencia.
Intenta usar el "%h"
modificador:
scanf("%hu", &length);
^
ISO/CEI 9899:201x – 7.21.6.1-7
Especifica que el siguiente especificador de conversión d , i , o , u , x , X o n se aplica a un argumento con tipo puntero a corto o corto sin signo.
Para scanf
necesitas usar %hu
ya que está pasando un puntero a un unsigned short
. Para printf
es imposible pasar un unsigned short
debido a promociones predeterminadas (se promocionará a int
o unsigned int
dependiendo de si int
tiene al menos tantos bits de valor como unsigned short
o no) entonces %d
o %u
está bien. Eres libre de usar %hu
aunque si lo prefieres.
Desde la página del manual de Linux:
h A following integer conversion corresponds to a short int or unsigned short int argument, or a fol‐
lowing n conversion corresponds to a pointer to a short int argument.
Entonces, para imprimir un entero corto sin signo, la cadena de formato debe ser "%hu"
.
Aquí hay un buena mesa por printf
especificadores. asi que deberia ser %hu
por unsigned short int
.
Y enlace a Wikipedia “Tipos de datos C” también.
printf("%u\n", (unsigned int)length); //
siempre funciona, ya que la especificación C99 que lees garantiza quesizeof(short) <= sizeof(int)
(pero las respuestas reales a esta pregunta a continuación son, por supuesto, mucho mejores)– Felipe
2 de enero de 2012 a las 14:39
No hay necesidad de yeso; las promociones predeterminadas se encargan de ello.
– R.. GitHub DEJA DE AYUDAR A ICE
2 de enero de 2012 a las 15:37