打印unsigned long long int值类型返回奇怪的结果

时间:2012-05-19 09:51:42

标签: c syntax printf unsigned-long-long-int

使用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)


为什么表现如此?你能解释一下吗?

4 个答案:

答案 0 :(得分:11)

这是错误的:

printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);

您使用的是unsigned long long格式说明符,但您传递了intunsigned 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。只要传递的可以使用格式说明符指定的类型表示,也可以将无符号类型传递给带符号的格式说明符,反之亦然。

因此,您必须对intshort小心谨慎,但您可以对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),它将起作用。