424
#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. 你怎么printf()一个unsigned long long int

4

13 回答 13

549

将 ll (el-el) long-long 修饰符与 u(无符号)转换一起使用。(适用于 Windows,GNU)。

printf("%llu", 285212672);
于 2008-08-05T21:02:35.237 回答
109

%d--> 为int

%u--> 为unsigned int

%ld--> 为long intlong

%lu--> for unsigned long intor long unsigned intorunsigned long

%lld--> 为long long intlong long

%llu--> 为unsigned long long intunsigned long long

于 2015-05-13T17:48:33.497 回答
100

您可能想尝试使用 inttypes.h 库,它为您提供诸如 、 等类型 int32_tint64_t然后uint64_t您可以使用它的宏,例如:

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

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

于 2008-08-12T11:07:50.060 回答
40

对于使用 MSVS 的 long long(或 __int64),您应该使用 %I64d:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
于 2009-09-06T14:26:41.233 回答
37

那是因为 %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.
于 2008-09-09T07:54:37.927 回答
16

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

虽然我发现它在 Windows 2000 中不起作用,但那里似乎有一个错误!

于 2008-09-11T00:57:55.150 回答
8

使用 VS2005 将其编译为 x64:

%llu 运行良好。

于 2012-10-11T06:23:13.393 回答
5

显然,自 2008 年以来十多年来,没有人提出多平台* 解决方案,所以我将附上我的 . 请点赞。(开玩笑。我不在乎。)

解决方案:lltoa()

如何使用:

#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s\n", lltoa(5555555555, dummy, 10));
printf("Another one: %s\n", lltoa(15555555555, dummy, 10));

OP的例子:

#include <stdio.h>
#include <stdlib.h> /* lltoa() */

int main() {
    unsigned long long int num = 285212672; // fits in 29 bits
    char dummy[255];
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %s. "
        "A normal number is %d.\n", 
        sizeof(num), lltoa(num, dummy, 10), normalInt);
    return 0;
}

%lld打印格式字符串不同,这个字符串适用于我在 Windows 上的 32 位 GCC 下。

*) 好吧,几乎是多平台的。在 MSVC 中,您显然需要_ui64toa()代替lltoa().

于 2019-03-22T19:08:07.163 回答
3

除了人们多年前写的:

  • 您可能会在 gcc/mingw 上收到此错误:

main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]

printf("%llu\n", k);

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

于 2016-01-17T12:27:29.953 回答
3

你如何格式化unsigned long long intusing printf

由于 C99 在转换说明符之前使用"ll"(ell-ell) o,u,x,X

除了许多答案中的 base 10 选项外,还有 base 16 和 base 8 选项:

选择包括

unsigned long long num = 285212672;
printf("Base 10: %llu\n", num);
num += 0xFFF; // For more interesting hex/octal output.
printf("Base 16: %llX\n", num); // Use uppercase A-F
printf("Base 16: %llx\n", num); // Use lowercase a-f
printf("Base  8: %llo\n", num);
puts("or 0x,0X prefix");
printf("Base 16: %#llX %#llX\n", num, 0ull); // When non-zero, print leading 0X
printf("Base 16: %#llx %#llx\n", num, 0ull); // When non-zero, print leading 0x
printf("Base 16: 0x%llX\n", num); // My hex fave: lower case prefix, with A-F

输出

Base 10: 285212672
Base 16: 11000FFF
Base 16: 11000fff
Base  8: 2100007777
or 0x,0X prefix
Base 16: 0X11000FFF 0
Base 16: 0x11000fff 0
Base 16: 0x11000FFF
于 2021-02-03T13:33:30.717 回答
1

非标准的东西总是很奇怪:)

对于 GNU 下的 long long 部分,它是L,llq

在窗户下,我相信它ll只是

于 2008-08-05T21:03:07.810 回答
0

好吧,一种方法是使用 VS2008 将其编译为 x64

这将按您的预期运行:

int normalInt = 5; 
unsigned long long int num=285212672;
printf(
    "My number is %d bytes wide and its value is %ul. 
    A normal number is %d \n", 
    sizeof(num), 
    num, 
    normalInt);

对于 32 位代码,我们需要使用正确的 __int64 格式说明符 %I64u。于是就变成了。

int normalInt = 5; 
unsigned __int64 num=285212672;
printf(
    "My number is %d bytes wide and its value is %I64u. 
    A normal number is %d", 
    sizeof(num),
    num, normalInt);

此代码适用于 32 位和 64 位 VS 编译器。

于 2008-08-05T21:40:24.757 回答
0

十六进制:

printf("64bit: %llp", 0xffffffffffffffff);

输出:

64bit: FFFFFFFFFFFFFFFF
于 2015-07-26T09:57:06.023 回答