如何使用 printf 格式化无符号长整数?

#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

925510 次浏览

使用ll (el-el) long-long修饰符和u (unsigned)转换。(适用于windows, GNU)。

printf("%llu", 285212672);

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

为长长部分 在GNU下它是Lllq

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

一种方法是用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编译器。

您可能想尝试使用inttypes.h库,该库为您提供类型,例如 int32_tint64_tuint64_t等。 然后你可以使用它的宏,如:

#include <inttypes.h>


uint64_t x;
uint32_t y;


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

这是“保证”的;这样就不会像longunsigned long long等那样给你带来麻烦,因为你不必猜测每种数据类型中有多少位。

这是因为%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.

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

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

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

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i

使用VS2005将其编译为x64:

%llu运行良好。

%d——>用于int

%u——>用于unsigned int

%ld——>用于long intlong

%lu——>用于unsigned long intlong unsigned intunsigned long

%lld——>用于long long intlong long

%llu——>用于unsigned long long intunsigned long long

十六进制:

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

输出:

64bit: FFFFFFFFFFFFFFFF

除了人们多年前写的:

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

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

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

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

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

解决方案: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()

如何使用printf格式化unsigned long long int ?

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

很多答案中除了10进制选项外,还有16进制和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

格式化unsigned long long的一种可能是使用uintmax_t。该类型自C99以来就可用了,与stdint.h中找到的其他一些可选的精确宽度类型不同,uintmax_t在标准中是要求(它的有符号对应物intmax_t也是如此)。

根据标准,uintmax_t类型可以表示任何无符号整数类型的任何值

可以使用%ju转换说明符打印uintmax_t值(而intmax_t可以使用%jd打印)。要打印一个不是uintmax_t的值,必须先转换为uintmax_t以避免未定义的行为:

#include <stdio.h>
#include <stdint.h>


int main(void) {
unsigned long long num = 285212672;
printf("%ju\n", (uintmax_t)num);


return 0;
}