【问题标题】:What is the format specifier for unsigned short int?unsigned short int 的格式说明符是什么?
【发布时间】:2012-01-31 18:10:49
【问题描述】:

我有以下程序

#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,但它仍在发出警告。

【问题讨论】:

  • printf("%u\n", (unsigned int)length); // 始终有效,因为您阅读的 C99 规范保证 sizeof(short) &lt;= sizeof(int)(但下面这个问题的实际答案当然要好得多)
  • 不需要演员表;默认促销会处理它。

标签: c scanf


【解决方案1】:

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

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

ISO/IEC 9899:201x - 7.21.6.1-7

指定以下 d 、 i 、 o 、 u 、 x 、 X 或 n 转换 说明符适用于类型为 指向短或指针的参数 无符号短

【讨论】:

    【解决方案2】:

    对于scanf,您需要使用%hu,因为您传递的是指向unsigned short 的指针。对于printf,由于默认提升,不可能传递unsigned short(它将提升为intunsigned int,具体取决于int 是否具有至少与unsigned short 一样多的值位)所以%d%u 很好。不过,如果您愿意,可以随意使用 %hu

    【讨论】:

      【解决方案3】:

      来自 Linux 手册页:

      h 后面的整数转换对应于一​​个短整型或无符号短整型参数,或以下 降低 n 转换对应于指向短 int 参数的指针。

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

      【讨论】:

      • 我不认为这就是你“printf”短整数的方式,因为它们会自动提升为整数(就像字符一样)。
      • @Alex %hu/%hd in printf 确实有效。 %hhu/%hhd 仅从 C99 开始可用。 %h 和 %hh 分别表示 &0xFFFF。 &0xFF 在传递的整数上。
      【解决方案4】:

      这是good table 用于printf 说明符。所以unsigned short int应该是%hu

      还有link to Wikipedia "C data types"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-22
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-22
        • 2013-06-22
        • 1970-01-01
        相关资源
        最近更新 更多