C语言 格式化long的printf的转换说明符是什么?

6jygbczu  于 2022-12-22  发布在  其他
关注(0)|答案(7)|浏览(167)

printf函数接受一个参数类型,例如%dsigned int%i。但是,我没有看到long值的任何内容。

mklgxw1f

mklgxw1f1#

我想你的意思是:

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

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

zyfwsgd62#

在大多数平台上,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

顺便说一句,“长”已经不那么重要了(在主流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

nom7f22z

nom7f22z3#

这取决于,如果你指的是unsigned long,格式字符是"%lu",如果你指的是signed long,格式字符是"%ld"

58wvjzkj

58wvjzkj5#

我需要打印unsigned long long,所以我发现下面的代码可以工作:

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

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

lb3vh1jj

lb3vh1jj6#

我认为要确切地回答这个问题,需要知道您正在使用的编译器名称和版本,以及它正在编译的平台(CPU类型、操作系统等)。

92vpleto

92vpleto7#

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

unsigned long n;
long m;

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

相关问题