提问



printf函数采用参数类型,例如%d%i作为signed int。但是,我没有看到long值的任何内容。

最佳参考


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


unsigned long n;
long m;

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

其它参考1


我想你的意思是:


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


要么


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

其它参考2


在大多数平台上,longint的大小相同(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


顺便说一下,long并不意味着那么多(在主流x64上)。int是平台默认的int大小,通常是32位。long通常是相同的大小。但是,它们在旧版本上具有不同的可移植性语义平台(和现代嵌入式平台!)。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 [26]

其它参考3


这取决于,如果您指的是unsigned long,则格式化字符为"%lu"。如果您指的是签名长格式字符是"%ld"

其它参考4


%ld参见cplusplus.com [27]参考[27]

其它参考5


如果您打算像我一样打印unsigned long long,请使用:


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


对于所有其他组合,我相信您使用printf手册中的表格,对于您尝试打??印的任何类型(与上面的printf("%llu", n)一样),获取行,然后是列标签。[28]

其它参考6


我想回答这个问题肯定需要知道你正在使用的编译器名称和版本以及它正在编译的平台(CPU类型,操作系统等)。