printf
函数需要一个参数类型,例如%d
或%i
用于有符号整数signed int
。然而,我没有看到任何适用于long
值的选项。
printf
函数需要一个参数类型,例如%d
或%i
用于有符号整数signed int
。然而,我没有看到任何适用于long
值的选项。
在说明符前直接放置小写字母l
。
unsigned long n;
long m;
printf("%lu %ld", n, m);
printf("%ld", ULONG_MAX)
输出的结果为-1。根据@Blorgbeard所述,应该使用printf("%lu", ULONG_MAX)
来输出无符号长整型。 - jammus%ld
,以与OP问题更加协调。 - DrBeco%l
会触发warning: unknown conversion type character 0x20 in format [-Wformat]
。 - Patrizio Bertoniunsigned 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平台上,“long”已经不再有太多意义了。“int”是平台默认的整数大小,通常为32位。“long”通常是相同大小的。但是,在旧平台(和现代嵌入式平台!)上,它们具有不同的可移植性语义。“long long”是一个64位数字,通常是人们想要使用的,除非他们确实知道在编辑跨平台可移植代码时在做什么。即使那样,他们可能也会使用宏来捕获类型的语义含义(例如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位,但这样做会导致疯狂的可移植性问题。当然,即使这也是复杂而历史悠久的真相的简化版。参见维基:整数
long
”是否仍然正确。例如,我在Oracle Linux x86_64/amd64上使用nvcc
时,long
是8个字节。 - interestedparty333long
与字/指针大小相同(因此在32位Linux上为32位,在64位Linux上为64位)。如果您查看Linux内核代码或Linux驱动程序内部,它们通常将指针存储在long
或unsigned long
变量中。实际上,几周前,我的一位同事将一些代码从Windows移植到Linux时,不得不将我们所有的long
更改为uint32_t
,因为我们在Windows下开发时经常误用它们。 - adentinger这要看具体情况,如果你指的是无符号长整型,格式字符是"%lu"
。 如果你指的是有符号长整型,格式字符是"%ld"
。
我需要打印 unsigned long long
,所以我发现这个方法可行:
unsigned long long n;
printf("%llu", n);
对于所有其他组合,我认为您可以使用printf手册中的表格,根据您要打印的类型取行和列标签(如我在上面使用printf("%llu", n)
)。
我认为要明确回答这个问题需要知道您使用的编译器名称和版本以及它所编译的平台(CPU类型、操作系统等)。
int
也不是可移植的。历史上,int
是一个16位的值;在一些机器上(例如Cray),它也是一个64位的值。即使是“精确宽度类型”如int64_t
,也不是100%可移植的;只有在架构支持这种类型时才定义。int_least64_t
类型是最接近可移植的类型。 - Jonathan Lefflerfprintf
函数,§7.21.6.3printf
函数 的条目大多重定向到¶7.21.6.1。POSIX规范是printf()
。 - Jonathan Lefflerint
在某些情况下可能是最佳选择,但它并不具备可移植性;例如,小型for
循环的索引通常不需要可移植性。另一方面,long
既不具备可移植性,也从来没有用处,也不是最佳选择。long
就是糟糕的。如果您需要保证为32位或64位的东西,则使用uint32_t
或uint64_t
。简单明了。如果在某些奇特的平台上它们不可用,则您的代码将无法编译,这正是您想要的。 - MarcH