printf的格式很长的论点是什么?

Tho*_*ens 461 c printf long-integer

printf函数采用参数类型,例如%d%i用于signed int.但是,我没有看到任何long价值.

pos*_*ist 593

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

unsigned long n;
long m;

printf("%lu %ld", n, m);
Run Code Online (Sandbox Code Playgroud)

  • `printf("%ld",ULONG_MAX)`将值输出为-1.对于unsigned long,应该是`printf("%lu",ULONG_MAX)`,如下面@Blorgbeard所描述的那样. (14认同)
  • 改变我的答案是正确的,因为这是接受的答案.我不想让人误入歧途. (5认同)
  • 实际上,你应该把它改成`%ld`,与OP问题更加和谐. (2认同)

Blo*_*ard 187

我想你的意思是:

unsigned long n;
printf("%lu", n);   // unsigned long
Run Code Online (Sandbox Code Playgroud)

要么

long n;
printf("%ld", n);   // signed long
Run Code Online (Sandbox Code Playgroud)


Dav*_*son 67

在大多数平台上,long并且int具有相同的大小(32位).不过,它确实有自己的格式说明符:

long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned
Run Code Online (Sandbox Code Playgroud)

对于64位,你需要一个long long:

long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned
Run Code Online (Sandbox Code Playgroud)

哦,当然,它在Windows中有所不同:

printf("%l64d", n); // signed
printf("%l64u", un); // unsigned
Run Code Online (Sandbox Code Playgroud)

通常,当我打印64位值时,我发现以十六进制打印它们很有帮助(通常数字很大,它们是指针或位字段).

unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"
Run Code Online (Sandbox Code Playgroud)

将打印:

0x00000000DEADBEEF
Run Code Online (Sandbox Code Playgroud)

顺便说一句,"长"并不意味着那么多(在主流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 
Run Code Online (Sandbox Code Playgroud)

在当天,"int"是16位.您认为现在它将是64位,但不会,这会导致疯狂的可移植性问题.当然,即使这是对神秘和历史丰富真相的简化.请参阅wiki:Integer

  • 只是为了澄清:有比x86和x64更多的架构,在这些架构上,char,short,int,long和long long有不同的含义.例如,具有16位存储器对齐的32位mcu可以使用:char = short = int = 16 bit; long = 32位; long long = 64位 (4认同)
  • @AndresR - 绝对的,这对于进行嵌入式编程的人来说非常重要(我曾经为烟雾报警器构建了一个内核模块)。当那些可怜的人尝试使用不是为了可移植性而编写的代码时,请怜悯他们。 (2认同)
  • 我不太确定“大多数平台都有一个大小为 32 的‘long’”是否仍然正确。例如,我使用的是 Oracle Linux x86_64/amd64,并且对于“nvcc”,“long”是 8 个字节。 (2认同)

kra*_*ato 17

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


Dol*_*cci 11

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

unsigned long long n;
printf("%llu", n);
Run Code Online (Sandbox Code Playgroud)

对于所有其他组合,我相信您使用printf手册中的表格,对于您要尝试打印的任何类型,使用行,然后是列标签(printf("%llu", n)如上所述).