Answers:
l
在说明符前直接放置一个(小写字母L)。
unsigned long n;
long m;
printf("%lu %ld", n, m);
printf("%ld", ULONG_MAX)
输出值为-1。应设置printf("%lu", ULONG_MAX)
为无符号,如下面@Blorgbeard所述。
%ld
,以与OP问题更加协调。
%l
触发warning: unknown conversion type character 0x20 in format [-Wformat]
我想你的意思是:
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位,但是不会,这会引起疯狂的可移植性问题。当然,即使这只是奥秘和历史悠久的事实的简化。参见维基:整数
long
的大小为32”是否仍然正确。例如,我在Oracle的Linux x86_64的/ AMD64,并与nvcc
一个long
8个字节。
%ld
请参阅printf
cplusplus.com上的参考
如果您要照unsigned long long
原样打印,请使用:
unsigned long long n;
printf("%llu", n);
对于所有其他组合,我相信您可以使用printf手册中的表格,获取要打印的任何类型的行,然后获取列标签(就像我printf("%llu", n)
上面所做的一样)。