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

c syntax printf format-specifiers long-long

677236 观看

12回复

#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

作者: andrewrk 的来源 发布者: 2019 年 5 月 29 日

回应 (12)


409

决定

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

printf("%llu", 285212672);
作者: John Downey 发布者: 05.08.2008 09:02

80

您可能需要使用inttypes.h库,让你的类型,如尝试 int32_tint64_tuint64_t等等,那么你可以使用它的宏,例如:

uint64_t x;
uint32_t y;

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

这是“保证”不给你同样的麻烦的longunsigned long long等等,因为你不必去猜测有多少位是每个数据类型。

作者: Nathan Fellman 发布者: 12.08.2008 11:07

49

%d- >为 int

%u- >为 unsigned int

%ld- >为 long int

%lu- >为 unsigned long int

%lld- >为 long long int

%llu- >为 unsigned long long int

作者: Shivam Chauhan 发布者: 13.05.2015 05:48

36

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

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
作者: Steven 发布者: 06.09.2009 02:26

32

这是因为%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.
作者: Paul Hargreaves 发布者: 09.09.2008 07:54

12

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

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

作者: Adam Pierce 发布者: 11.09.2008 12:57

8

使用VS2005将其编译为x64:

%llu效果很好。

作者: Sandy 发布者: 11.10.2012 06:23

4

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

对于GNU下的长期部分Lll或者q

在Windows下,我相信这是ll唯一的

作者: sparkes 发布者: 05.08.2008 09:03

4

十六进制:

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

输出:

64bit: FFFFFFFFFFFFFFFF
作者: lama12345 发布者: 26.07.2015 09:57

2

除了几年前人们写的东西:

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

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

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

然后您的mingw版本不会默认为c99。添加此编译器标志:-std=c99

作者: Bernd Elkemann 发布者: 17.01.2016 12:27

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编译器。

作者: vzczc 发布者: 05.08.2008 09:40

0

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

简而言之:

#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下的GCC。

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

作者: 7vujy0f0hy 发布者: 22.03.2019 07:08
32x32