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


回答:


634

l指定子の直前に(小文字のL)を置きます。

unsigned long n;
long m;

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

14
printf("%ld", ULONG_MAX)値を-1として出力します。printf("%lu", ULONG_MAX)以下の@Blorgbeardで説明されているように、署名されていない期間である必要があります。
jammus

2
実際には、%ldOP質問と調和するように、をに変更する必要があります。
Beco博士2015年

はい、Beco博士。さらに、ただ%lトリガーするwarning: unknown conversion type character 0x20 in format [-Wformat]
Patrizio Bertoni 2015


73

ほとんどのプラットフォーム上で、long及びint同じサイズ(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"は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を参照してください


@MM混乱を避けるために答えを明確にしました。
Dave Dopson、2015年

4
明確にするために:x86やx64よりも多くのアーキテクチャがあり、それらのアーキテクチャでは、char、short、int、long、long longは異なる意味を持っています。たとえば、16ビットのメモリアライメントを備えた32ビットのmcuは次のように使用できます。char= short = int = 16 bit; long = 32ビット; 長い長= 64ビット
AndresR

1
@AndresR-絶対に、そしてそれは組み込みプログラミングを行う人々にとって非常に重要です(私は一度煙警報用のカーネルモジュールを構築しました)。可搬性のために作成されていないコードを使用しようとする貧しい人々に同情してください。
Dave Dopson 2016

「ほとんどのプラットフォームlongでサイズが32である」がまだ当てはまるかどうか、私にはよくわかりません。たとえば、私はOracle Linux x86_64 / amd64を使用していてnvcc、a longは8バイトです。
ragerdl

「ああ、もちろん、Windowsでは違います」。クロスプラットフォームのソリューションはありますか?
アーロンフランケ

17

unsigned longを参照している場合、フォーマット文字はに依存します"%lu"。signed longを参照している場合、フォーマット文字は"%ld"です。



12

unsigned long long私のように印刷したい場合は、以下を使用してください。

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

他のすべての組み合わせについては、printfマニュアルの表を使用し、(printf("%llu", n)上記で行ったように)印刷しようとしているタイプの行と列のラベルを使用すると思います。


0

この質問に明確に答えるには、使用しているコンパイラの名前とバージョン、およびコンパイル対象のプラットフォーム(CPUタイプ、OSなど)を知っている必要があります。


あなたの答えはコメントであるべきで、それ自体は答えではありません。
Jaime Hablutzel、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.