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


125

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

#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? Если да, то почему я получаю вышеупомянутое предупреждение ?!

РЕДАКТИРОВАТЬ: Большую часть времени я пытался, %uhи он все еще давал предупреждение.


2
printf("%u\n", (unsigned int)length); //всегда работает, поскольку спецификация C99, которую вы читаете, гарантирует это sizeof(short) <= sizeof(int)(но фактические ответы на этот вопрос ниже, конечно, намного лучше)
Филипп

1
Нет необходимости в гипсе; промо-акции по умолчанию позаботятся об этом.
R .. GitHub НЕ ПОМОГАЕТ ICE 02

Ответы:


156

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

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

ИСО / МЭК 9899: 201x - 7.21.6.1-7

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


47

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


8

На странице руководства Linux:

h Следующее целочисленное преобразование соответствует аргументу short int или unsigned short int, либо следующему
       преобразование n соответствует указателю на короткий аргумент типа int.

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


Я не думаю, что вы сокращаете целые числа с помощью printf, потому что они автоматически превращаются в целые числа (как и символы).
Алексей Фрунзе

2
@Alex% hu /% hd в printf действительно работает. Это был% hhu /% hhd, который доступен только начиная с C99. % h и% hh подразумевают & 0xFFFF соответственно. & 0xFF переданного целого числа.
jørgensen 02

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.