long をフォーマットする printf の引数は何ですか?

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

ほとんどのプラットフォームでは、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 ビット値を出力するときは、16 進数で出力すると便利な場合がよくあります (通常、数値が大きい場合、それらはポインターまたはビット フィールドです)。

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:整数を参照