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

bro*_*ng0 11 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修饰符(根据你如何printf一个unsigned long long int(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);
Run Code Online (Sandbox Code Playgroud)

返回:

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);
Run Code Online (Sandbox Code Playgroud)

返回:

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);
Run Code Online (Sandbox Code Playgroud)

返回:

unsigned long long int:18446744073709551615 to 1580552164021 (Dev-Cpp)

unsigned long long int:18446744073709551615 to 0 (Visual Studio)


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

Die*_*Epp 11

这是错的:

printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);
Run Code Online (Sandbox Code Playgroud)

您使用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);
Run Code Online (Sandbox Code Playgroud)

说明:当传递参数时printf,任何可以适合的类型int都被提升为int,然后任何可以适合的类型unsigned int都被提升为unsigned int.只要传递的可以使用格式说明符指定的类型表示,也可以将无符号类型传递给带符号的格式说明符,反之亦然.

所以,你必须小心地使用longlong long,但你可以马虎使用int,shortchar.

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

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’


Ale*_*nze 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);
Run Code Online (Sandbox Code Playgroud)