打印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
格式说明符,但传递int
和unsigned 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
。 只要传递的值可以使用格式说明符指定的类型表示,也可以将无符号类型传递给带符号的格式说明符,反之亦然。
所以你必须小心long
和long long
,但你可以用int
, short
和char
。
大多数编译器都有设置让他们警告你这类错误,因为它可以很容易地在编译时检测到; 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),它将工作。