printf函数接受一个参数类型,例如signed int的参数类型为%d或%i。但是,我没有看到任何long值。
printf
signed int
%d
%i
long
%ld参见printf参考cplusplus.com
%ld
将l(小写字母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
我认为明确地回答这个问题需要知道编译器的名称和版本,以及它正在编译的平台(CPU类型,操作系统等)。
如果你想打印unsigned long long,使用:
unsigned long long
unsigned long long n; printf("%llu", n);
对于所有其他组合,我相信您使用了来自printf手册的表,为您试图打印的任何类型取行,然后列标签(正如我对上面的printf("%llu", n)所做的那样)。
printf("%llu", n)
在大多数平台上,long和int是相同的大小(32位)。不过,它确实有自己的格式说明符:
int
long n; unsigned long un; printf("%ld", n); // signed printf("%lu", un); // unsigned
对于64位,你需要一个long long:
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位的,但不,那会导致疯狂的可移植性问题。当然,即便如此,这也是对神秘而历史悠久的真相的一种简化。看到# EYZ0
这取决于,如果你指的是unsigned long,格式化字符是"%lu"。如果您指的是带符号的长字符,则格式化字符为"%ld"。
"%lu"
"%ld"