¿Cuál es el especificador de formato para int corto sin firmar?

2 minutos de lectura

avatar de usuario
Sangeeth Saravanaraj

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, longetc) 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.

  • printf("%u\n", (unsigned int)length); // siempre funciona, ya que la especificación C99 que lees garantiza que sizeof(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

avatar de usuario
cnicutar

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 scanfnecesitas usar %hu ya que está pasando un puntero a un unsigned short. Para printfes 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".

  • No creo que así sea como se “imprimen” entradas cortas porque se promocionan automáticamente a entradas (al igual que los caracteres).

    – Alexei Frunze

    02/01/2012 a las 11:00

  • @Alex %hu/%hd en printf funciona. Era %hhu/%hhd que solo está disponible a partir de C99. %h y %hh implican una respuesta &0xFFFF. &0xFF en el entero pasado.

    – Jorgensen

    2 de enero de 2012 a las 13:11


avatar de usuario
FooBar167

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.

¿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