unsigned short int的格式说明符是什么?


124

我有以下程序

#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,并使用长度调节剂(如当不明白正确的格式指定符shortlong等)与unsigned用于int数据类型。

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

编辑:大多数时候,我都在尝试%uh,但仍在发出警告。


2
printf("%u\n", (unsigned int)length); //始终有效,因为您阅读的C99规范可以保证sizeof(short) <= sizeof(int)(但是,对于以下问题的实际答案当然更好)
Philip

1
不需要演员;默认促销会照顾好它。
R .. GitHub停止帮助ICE

Answers:


155

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

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

ISO / IEC 9899:201x-7.21.6.1-7

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


47

对于scanf,您需要使用,%hu因为您要传递指向的指针unsigned short。对于printf,不可能传递unsigned short由于默认提升而引起的(将提升为intunsigned int取决于是否int具有至少与之相同的值位unsigned short),这样%d还是%u可以的。%hu不过,如果愿意,您可以自由使用。


7

从Linux手册页:

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

因此,要输出无符号的短整数,格式字符串应为"%hu"


我不认为这是您“ printf”短整数的方式,因为它们会自动提升为整数(就像字符一样)。
Alexey Frunze'1

2
@printf中的@Alex%hu /%hd确实起作用。仅从C99开始可用的是%hhu /%hhd。%h和%hh表示&0xFFFF。&0xFF传递的整数。
约根森

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.