printf
関数は、signed int
の場合は%d
または%i
のような引数型をとります。ただし、long
の値は表示されません。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
私は決定的にこの質問に答えることを考える(コンパイラ名とバージョン、使用しているプラットフォームを知る必要となりますCPUの種類、OSなど)をコンパイルしています。
私は、使用したとしてunsigned long long
を印刷するために探している場合:他のすべての組み合わせについては
unsigned long long n;
printf("%llu", n);
、私は行を取って、あなたはthe printf manualからテーブルを使用して信じて、どんなタイプのため、列ラベルあなたは印刷しようとしています(上記のprintf("%llu", n)
と同じです)。
ほとんどのプラットフォームでは、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ビットの値を印刷しているときに、頻繁に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:Integer
@ M.M私は混乱を避けるために私の答えを明確にしました。 –
明確にする:x86とx64より多くのアーキテクチャがあり、これらのアーキテクチャでは、char、short、int、longとlong longは異なる意味を持つ。例えば、16ビットのメモリアラインメントを有する32ビットのMCUは、以下を使用することができる。 char = short = int = 16ビット; long = 32ビット。 long long = 64ビット – AndresR
@AndresR - 絶対に、組み込みプログラミングを行っている人にとっては非常に深いことです(私は一度火災警報用のカーネルモジュールを構築しました)。移植性のために書かれていないコードを使用しようとすると、それらの貧しい人々を哀れみます。 –
符号なしlongを参照している場合は、書式設定文字は"%lu"
です。長い符号付きの場合は、書式設定文字は"%ld"
です。
'printf("%ld "、ULONG_MAX)'は値を-1として出力します。下の@Blorgbeardで説明されているように、unsigned longの場合は 'printf("%lu "、ULONG_MAX)'にする必要があります。 – jammus
私の答えは正解で、それが受け入れられた答えであると見なされました。私は人を迷わせたくない。 – postfuturist
実際には、OP質問とより調和するように、これを '%ld'に変更する必要があります。 –