C语言 无符号短整型的格式说明符是什么?

fnx2tebb  于 2023-02-18  发布在  其他
关注(0)|答案(5)|浏览(246)

我有以下程序

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

pqwbnv8z

pqwbnv8z1#

尝试使用"%h"修改器:

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

国际标准化组织/国际电工委员会9899:201 x- 7.21.6.1-7
指定后面的d、i、o、u、x、X或n转换说明符应用于类型为的参数,指针指向short或unsigned short

r55awzrz

r55awzrz2#

对于scanf,需要使用%hu,因为要传递一个指向unsigned short的指针;对于printf,由于默认的升级,不可能通过unsigned short(根据int是否至少具有与unsigned short一样多的值位,它将被提升为intunsigned int)所以%d%u都可以,不过如果愿意,您可以自由使用%hu

qfe3c7zg

qfe3c7zg3#

从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"

nzkunb0c

nzkunb0c4#

这里有一个good table对应printf说明符,所以应该是%hu对应unsigned short int
还有link to Wikipedia "C data types"

velaa5lx

velaa5lx5#

“对于printf,由于默认提升(它将被提升为int或unsigned int,具体取决于int是否至少具有与unsigned short一样多的值位),因此不可能传递unsigned short,因此%d或%u可以。”---
但是他仍然可以把这个短整型的值改变成一个0和1的数组,然后用另一个循环来创建一个短整型值并打印出来。

相关问题