格式化long的printf的参数是什么?


Answers:


633

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

unsigned long n;
long m;

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

14
printf("%ld", ULONG_MAX)输出值为-1。应设置printf("%lu", ULONG_MAX)为无符号,如下面@Blorgbeard所述。
jammus 2011年

2
实际上,您应该将其更改为%ld,以与OP问题更加协调。
Beco博士

是的Beco博士;更进一步,只是%l触发warning: unknown conversion type character 0x20 in format [-Wformat]
Patrizio Bertoni 2015年

189

我想你的意思是:

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

要么

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

73

在大多数平台上,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位,但是不会,这会引起疯狂的可移植性问题。当然,即使这只是奥秘和历史悠久的事实的简化。参见维基:整数


@MM我澄清了我的答案以避免混淆。
戴夫·多普森

4
需要澄清的是:除了x86和x64之外,还有更多的体系结构,在这些体系结构上,char,short,int,long和long long具有不同的含义。例如,具有16位内存对齐方式的32位MCU可以使用:char = short = int = 16 bit; long = 32位;long long = 64位
AndresR

1
@AndresR-绝对,这对进行嵌入式编程的人非常重要(我曾经为烟雾报警器构建了一个内核模块)。当那些可怜的人尝试使用非为可移植性编写的代码时,可怜他们。
戴夫·多普森

我不确定“大多数平台long的大小为32”是否仍然正确。例如,我在Oracle的Linux x86_64的/ AMD64,并与nvcc一个long8个字节。
ragerdl

“哦,当然,在Windows中是不同的”。有跨平台的解决方案吗?
亚伦·弗兰克

17

这取决于是否要使用无符号长格式字符"%lu"。如果您指的是带符号的long,则格式字符为"%ld"



12

如果您要照unsigned long long原样打印,请使用:

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

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


0

我想确定性地回答这个问题将需要知道您使用的编译器名称和版本以及要为其编译的平台(CPU类型,OS等)。


您的答案应该是评论,而不是单独的答案。
Jaime Hablutzel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.