使用printf
函数打印unsigned long long int
类型的值
我不知道出了什么问题。我在Windows 7 Professional 64位上使用Dev-Cpp 4.9.9.2和Visual Studio 2010 Professional(我知道它不是C编译器,但无论如何,想要尝试)。为了显示,我使用了%llu
修饰符(根据How do you printf an unsigned long long int(the format specifier for unsigned long long int)?),但我也尝试了I64d而没有效果......
首先,我只想打印unsigned long long int
的最小值和最大值(使用ULONG_MAX
中的limits.h
)
printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);
返回:
unsigned long long int:18446744069414584320 to 1580552164021 (Dev-Cpp)
unsigned long long int:18446744069414584320 to 0 (Visual Studio)
然后我尝试使用printf
打印两个零
printf("unsigned long long int: \n%llu to %llu \n\n", 0, 0);
返回:
unsigned long long int: 0至1580552164021 (Dev-Cpp)
unsigned long long int:0到0 (Visual Studio)
还尝试了两个ULONG_MAX
值
printf("unsigned long long int: \n%llu to %llu \n\n", ULONG_MAX, ULONG_MAX);
返回:
unsigned long long int:18446744073709551615 to 1580552164021 (Dev-Cpp)
unsigned long long int: 18446744073709551615到0 (Visual Studio)
为什么表现如此?你能解释一下吗?
答案 0 :(得分:11)
这是错误的:
printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);
您使用的是unsigned long long
格式说明符,但您传递了int
和unsigned long
值。促销规则意味着您可以草拟所有int
- 大小或更小,不适用于long long
。
使用演员:
printf("unsigned long long int: \n%llu to %llu \n\n",
0ULL, (unsigned long long) ULONG_MAX);
说明:将参数传递给printf
时,任何适合int
的类型都会提升为int
,然后提升为适合unsigned int
的任何类型unsigned int
中的long
被提升为long long
。只要传递的值可以使用格式说明符指定的类型表示,也可以将无符号类型传递给带符号的格式说明符,反之亦然。
因此,您必须对int
和short
小心谨慎,但您可以对char
,-Wformat
和{{1}}草率。
大多数编译器都有设置让他们警告你这类错误,因为它可以很容易地在编译时被检测到; GCC和Clang有{{1}},会产生以下警告:
test.c:5: warning: format ‘%llu’ expects type ‘long long unsigned int’, but argument 2 has type ‘int’ test.c:5: warning: format ‘%llu’ expects type ‘long long unsigned int’, but argument 3 has type ‘long unsigned int’
答案 1 :(得分:10)
您没有通过unsigned long longs
。您正在传递int
(0)和unsigned long
(ULONG_MAX)。您必须准确传递给printf()
您希望传递格式字符串的内容。
请改为尝试:
printf("unsigned long long int: \n%llu to %llu \n\n", 0ULL, (unsigned long long)ULONG_MAX);
答案 2 :(得分:4)
ULONG_MAX
是指unsigned long
而不是unsigned long long
。对于后者,请使用ULLONG_MAX
(请注意额外的L
)。
您需要像这样更改printf()
来电:
printf("unsigned long long int: \n%llu to %llu \n\n", 0ULL, ULLONG_MAX);
printf("unsigned long long int: \n%llu to %llu \n\n", ULLONG_MAX, ULLONG_MAX);
这可确保printf()
的参数与格式说明符匹配。
答案 3 :(得分:0)
long long int是C99标准的类型,MSVC不支持此类型。使用支持C99的编译器(如适用于Windows的MinGW),它将起作用。