我有以下程序
#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
,它仍然在给出警告。
5条答案
按热度按时间pqwbnv8z1#
尝试使用
"%h"
修改器:国际标准化组织/国际电工委员会9899:201 x- 7.21.6.1-7
指定后面的d、i、o、u、x、X或n转换说明符应用于类型为的参数,指针指向short或unsigned short。
r55awzrz2#
对于
scanf
,需要使用%hu
,因为要传递一个指向unsigned short
的指针;对于printf
,由于默认的升级,不可能通过unsigned short
(根据int
是否至少具有与unsigned short
一样多的值位,它将被提升为int
或unsigned int
)所以%d
或%u
都可以,不过如果愿意,您可以自由使用%hu
。qfe3c7zg3#
从Linux手册页:
因此,要打印无符号短整数,格式字符串应该是
"%hu"
。nzkunb0c4#
这里有一个good table对应
printf
说明符,所以应该是%hu
对应unsigned short int
。还有link to Wikipedia "C data types"。
velaa5lx5#
“对于printf,由于默认提升(它将被提升为int或unsigned int,具体取决于int是否至少具有与unsigned short一样多的值位),因此不可能传递unsigned short,因此%d或%u可以。”---
但是他仍然可以把这个短整型的值改变成一个0和1的数组,然后用另一个循环来创建一个短整型值并打印出来。