打印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修饰符(根据你如何printf一个unsigned long long int(unsigned long long int的格式说明符)? )但我也试过I64d没有效果……


首先,我只想打印unsigned long long int最小值和最大值(使用limits.h ULONG_MAX

 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 to 0 (Visual Studio)


为什么它表现得那样? 你能解释一下吗?

这是错的:

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

您使用unsigned long long格式说明符,但传递intunsigned long值。 促销规则意味着您可以对大小或更小的所有内容草率,这不适用于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 。 只要传递的可以使用格式说明符指定的类型表示,也可以将无符号类型传递给带符号的格式说明符,反之亦然。

所以你必须小心longlong long ,但你可以用intshortchar

大多数编译器都有设置让他们警告你这类错误,因为它可以很容易地在编译时检测到; GCC和Clang有-Wformat导致以下警告:

 test.c:5:警告:格式'%llu'需要类型'long long unsigned int',但参数2的类型为'int'
 test.c:5:警告:格式'%llu'需要类型'long long unsigned int',但参数3的类型为'long unsigned int'

你没有传递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); 

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()的参数与格式说明符匹配。

long long int是C99标准的类型,MSVC不支持此。 使用支持C99的编译器(如MinGW for Windows),它将工作。