什么是printf的格式很长的参数?

printf函数采用参数types,例如%d%i作为signed int 。 但是,我没有看到任何long价值。

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

 unsigned long n; long m; printf("%lu %ld", n, m); 

我认为你的意思是:

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

要么

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

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

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

对于64位,你需要long longlong 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位值时,我发现在hex中打印它们是很有用的(通常是数字很大,它们是指针或位域)。

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

将打印:

 0x00000000DEADBEEF 

顺便说一句,“长”并不意味着(主stream的64位)。 “int”是平台默认的int大小,通常是32位。 “长”通常是相同的大小。 但是,它们在旧平台(和现代embedded式平台!)上具有不同的可移植性语义。 “long long”是一个64位数字,通常是人们使用的意思,除非他们真的知道他们在编辑x平台便携式代码。 即使这样,他们可能会用macros来捕捉types的语义(例如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位,但不会,这会导致疯狂的可移植性问题。 当然,这也是对奥秘和历史丰富的事实的简化。 请参阅Wiki:整数

这取决于,如果你指的是无符号长格式化字符是"%lu" 。 如果您指的是长符号,则格式化字符为"%ld"

%ld参见cplusplus.com上的printf参考

如果你打算unsigned long long打印unsigned long long ,请使用:

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

对于所有其他的组合,我相信你可以使用printf手册中的表格,把你想要打印的任何types的行,列标签和列标签(就像我上面的printf("%llu", n) )一样。

我想回答这个问题肯定会需要知道您正在使用的编译器名称和版本以及它正在编译的平台(CPUtypes,操作系统等)。