什么是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并且在使用unsigned inttypes的长度修饰符(如shortlong等)时无法理解正确的格式说明符。

%u是正确的说明符unsigned short int ? 如果是的话,为什么我会得到上述警告?

编辑:大部分时间,我正在尝试%uh ,它仍然给予警告。

尝试使用"%h"修饰符:

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

ISO / IEC 9899:201x – 7.21.6.1-7

指定以下d,i,o,u,x,X或n转换说明符适用于指针types为short或unsigned short的参数

对于scanf ,你需要使用%hu因为你正在传递一个指向unsigned short的指针。 对于printf ,由于缺省的促销(它会被提升为intunsigned int取决于int是否至less有与unsigned short int一样多的值),所以不可能传递一个unsigned short int ,所以%d%u是好的。 不过,你可以自由使用%hu

从Linux手册页:

 h以下整型转换对应于short int或unsigned short int参数,
       低n转换对应于一​​个短int参数的指针。

所以要打印一个无符号的短整数,格式string应该是"%hu"