#include <stdio.h>
int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

输出:

My number is 8 bytes wide and its value is 285212672l. A normal number is 0.

我假设这个意外的结果来自于输出unsigned long long int。你如何打印()一个unsigned long long int?


当前回答

%d——>为int

%u——>为unsigned int

%ld—>为长int或长

%lu——>用于unsigned long int或long unsigned int或unsigned long

%lld—>表示long long int或long long

%llu——>用于unsigned long long int或unsigned long long

其他回答

使用VS2005将其编译为x64:

%llu运行良好。

这是因为%llu不能在Windows下正常工作,而%d不能处理64位整数。我建议使用PRIu64,你会发现它也可以移植到Linux上。

试试这个吧:

#include <stdio.h>
#include <inttypes.h>

int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    /* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
    printf("My number is %d bytes wide and its value is %" PRIu64 ". A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

输出

My number is 8 bytes wide and its value is 285212672. A normal number is 5.

您可能想尝试使用inttypes.h库,它可以为您提供诸如 Int32_t, int64_t, uint64_t等。 然后你可以使用它的宏,如:

#include <inttypes.h>

uint64_t x;
uint32_t y;

printf("x: %"PRIu64", y: %"PRIu32"\n", x, y);

这“保证”不会给您带来与long、unsigned long等相同的麻烦,因为您不必猜测每种数据类型中有多少位。

在Linux中是%llu,在Windows中是%I64u

虽然我发现它不能在Windows 2000中工作,但似乎有一个bug !

除了人们多年前写的:

你可能会在gcc/mingw上得到这个错误:

main.c:30:3:警告:未知转换类型字符'l'的格式[-Wformat=]

printf(“%llu\n”, k);

那么你的mingw版本不会默认为c99。添加编译器标志:-std=c99。