我有以下程序
#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
,它仍然在发出警告。
尝试使用
"%h"
修饰符:
scanf("%hu", &length);
^
ISO/IEC 9899:201x - 7.21.6.1-7
指定以下 d 、 i 、 o 、 u 、 x 、 X 或 n 转换 说明符适用于类型为 pointer to short 或 无符号短.
对于
scanf
,您需要使用%hu
,因为您要将指针传递给unsigned short
。对于 printf
,由于默认提升,不可能通过 unsigned short
(它将提升为 int
或 unsigned int
,具体取决于 int
是否具有至少与 unsigned short
一样多的值位)所以 %d
或 %u
都可以。不过,如果您愿意,您可以自由使用%hu
。
来自 Linux 手册页:
h 下面的整数转换对应于一个 short int 或 unsigned short int 参数,或者一个 fol- lowing n 转换对应于指向 short int 参数的指针。
所以要打印一个无符号短整数,格式字符串应该是
"%hu"
.
对于
,由于默认提升(它将被提升为 int 或 unsigned int 取决于 int 是否具有至少与 unsigned short 一样多的值位)所以 unsigned short 是不可能的,所以printf
或%d
很好。%u
但他仍然可以将这个
short int
的值更改为 0 和 1 的数组和(带有指针),然后使用另一个循环创建一个 short int
值并打印出来我猜。
让我们这样做:
struct byte3data {
char a;
char b;
char c;
};
void my_printf(byte3data myOwnType) {
// Writing 3 bytes with printf() in the way we want
}
printf
只是基本工具,这就是我认为应该如何对待它。您可以以任何您想要的方式管理位。对于浮点运算,您可以说是或否,但也可以说多少。试着把句子中的printf
改成printf
s,再想一想。