561

该函数采用参数类型,printf例如%dor %isigned int但是,我没有看到任何long有价值的东西。

4

7 回答 7

724

在说明符之前直接放置一个l(小写字母 L)。

unsigned long n;
long m;

printf("%lu %ld", n, m);
于 2008-09-01T22:50:23.023 回答
200

我想你的意思是:

unsigned long n;
printf("%lu", n);   // unsigned long

或者

long n;
printf("%ld", n);   // signed long
于 2008-09-01T23:26:02.797 回答
90

在大多数平台上,long大小int相同(32 位)。不过,它确实有自己的格式说明符:

long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned

对于 64 位,您需要long long

long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned

哦,当然,它在 Windows 中有所不同:

printf("%l64d", n); // signed
printf("%l64u", un); // unsigned

通常,当我打印 64 位值时,我发现以十六进制打印它们会很有帮助(通常使用很大的数字,它们是指针或位域)。

unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"

将打印:

0x00000000DEADBEEF

顺便说一句,“长”不再意味着那么多(在主流 x64 上)。“int”是平台默认的 int 大小,通常为 32 位。“长”通常是相同的大小。但是,它们在旧平台(和现代嵌入式平台!)上具有不同的可移植性语义。“long long”是一个 64 位的数字,通常是人们想要使用的,除非他们真的知道他们在做什么编辑一段 x 平台可移植代码。即使这样,他们也可能会使用宏来捕获类型的语义含义(例如 uint64_t)。

char c;       // 8 bits
short s;      // 16 bits
int i;        // 32 bits (on modern platforms)
long l;       // 32 bits
long long ll; // 64 bits 

过去,“int”是 16 位。你会认为它现在是 64 位,但不,这会导致严重的可移植性问题。当然,即使这是对神秘而历史悠久的真理的简化。见维基:整数

于 2013-01-30T18:15:04.193 回答
17

这取决于,如果您指的是 unsigned long 格式字符是"%lu". 如果您指的是signed long,则格式字符是"%ld".

于 2013-03-06T02:20:44.893 回答
14

%ld请参阅printfcplusplus.com 上的参考资料

于 2008-09-01T22:47:59.987 回答
13

如果您想像unsigned long long我一样打印,请使用:

unsigned long long n;
printf("%llu", n);

对于所有其他组合,我相信您使用printf 手册中的表格,获取行,然后是您尝试打印的任何类型的列标签(就像我在printf("%llu", n)上面所做的那样)。

于 2012-10-28T19:24:46.693 回答
-2

我认为要明确回答这个问题需要知道您正在使用的编译器名称和版本以及它正在编译的平台(CPU 类型、操作系统等)。

于 2008-09-02T19:20:35.123 回答