Что такое спецификатор формата для unsigned short int?

У меня есть следующая программа

#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;
}

Что при компиляции с использованием gcc filename.c выдается следующее предупреждение (в строке scanf()).

warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]

Затем я ссылался на C99 specification - 7.19.6 Formatted input/output functions и не мог понять правильный спецификатор формата при использовании модификаторов длины (например, short, long и т.д.) с типом unsigned для int.

Является %u правильным спецификатором unsigned short int? Если да, то почему я получаю вышеупомянутое предупреждение?!

EDIT: Большую часть времени я пытался %uh, и он все еще выдавал предупреждение.

Ответ 1

Попробуйте использовать модификатор "%h":

scanf("%hu", &length);
        ^

ISO/IEC 9899: 201x - 7.21.6.1-7

Указывает, что следующие преобразования d, i, o, u, x, X или n specifier применяется к аргументу с типом указателем на короткий или unsigned short.

Ответ 2

Для scanf вам нужно использовать %hu, поскольку вы передаете указатель на unsigned short. Для printf невозможно выполнить unsigned short из-за промо-акций по умолчанию (ему будет присвоено значение int или unsigned int в зависимости от того, имеет ли int как минимум столько битов значения, сколько unsigned short или нет) поэтому %d или %u в порядке. Вы можете использовать %hu, если хотите.

Ответ 3

На странице руководства 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.

Итак, чтобы напечатать короткое целое без знака, строка формата должна быть "%hu".