11

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_MAXfrom limits.h)的最小值和最大值

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

回报:

unsigned long long int: 18446744069414584320 到 1580552164021 (Dev-Cpp)

unsigned long long int: 18446744069414584320 到 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 到 1580552164021 (Dev-Cpp)

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


为什么它会这样?你能给我解释一下吗?

4

4 回答 4

12

这是错误的:

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,任何可以适合 an 的类型int都被提升为int,然后任何可以适合 an 的类型unsigned int都被提升为unsigned int。也可以将无符号类型传递给有符号格式说明符,反之亦然,只要传递的可以使用格式说明符指定的类型来表示。

所以你必须小心使用longand 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”
于 2012-05-19T09:58:53.113 回答
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);
于 2012-05-19T09:58:08.260 回答
4

ULONG_MAXunsigned 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()与格式说明符相匹配。

于 2012-05-19T09:58:15.810 回答
0

long long int 是 C99 标准中的一种类型,MSVC 不支持这一点。使用支持 C99 的编译器(如 Windows 的 MinGW),它会工作。

于 2012-05-19T11:31:24.710 回答