printf
函数采用参数类型,例如 signed int
的 %d
或 %i
。但是,我没有看到任何 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
在大多数平台上,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 位,但不,这会导致严重的可移植性问题。当然,即使这是对神秘而历史悠久的真理的简化。请参阅wiki:Integer
long
”是否仍然正确。例如,我在 Oracle Linux x86_64/amd64 上,使用 nvcc
,long
为 8 个字节。
long
具有与字/指针大小相同的大小(因此在 32 位 Linux 上为 32 位,在 64 位 Linux 上为 64 位)。如果您查看 Linux 内核代码或 Linux 驱动程序内部,它们通常将指针存储在 long
或 unsigned long
变量中。实际上,几周前,我的一位同事将一些代码从 Windows 移植到 Linux,不得不将我们所有的 long
更改为 uint32_t
,因为我们在 Windows 下开发时会经常滥用它们。
这取决于,如果您指的是 unsigned long 格式字符是 "%lu"
。如果您指的是带符号的长格式字符,则格式字符为 "%ld"
。
如果您想像我一样打印 unsigned long long
,请使用:
unsigned long long n;
printf("%llu", n);
对于所有其他组合,我相信您使用 the printf manual 中的表格,获取您要打印的任何类型的行和列标签(就像我对上面的 printf("%llu", n)
所做的那样)。
我认为要明确回答这个问题需要知道您正在使用的编译器名称和版本以及它正在编译的平台(CPU 类型、操作系统等)。
printf("%ld", ULONG_MAX)
将值输出为 -1。正如下面@Blorgbeard 所描述的,对于无符号长应该是printf("%lu", ULONG_MAX)
。%ld
,以便与 OP 问题更加协调。%l
触发warning: unknown conversion type character 0x20 in format [-Wformat]