2008-09-01 10 views

答えて

464

を直接指定する前にl(小文字文字L)を入れてご覧ください。

私はあなたが意味を考える
unsigned long n; 
long m; 

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

'printf("%ld "、ULONG_MAX)'は値を-1として出力します。下の@Blorgbeardで説明されているように、unsigned longの場合は 'printf("%lu "、ULONG_MAX)'にする必要があります。 – jammus

+4

私の答えは正解で、それが受け入れられた答えであると見なされました。私は人を迷わせたくない。 – postfuturist

+2

実際には、OP質問とより調和するように、これを '%ld'に変更する必要があります。 –

179

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

または

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

私は決定的にこの質問に答えることを考える(コンパイラ名とバージョン、使用しているプラ​​ットフォームを知る必要となりますCPUの種類、OSなど)をコンパイルしています。

8

私は、使用したとしてunsigned long longを印刷するために探している場合:他のすべての組み合わせについては

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

、私は行を取って、あなたはthe printf manualからテーブルを使用して信じて、どんなタイプのため、列ラベルあなたは印刷しようとしています(上記のprintf("%llu", n)と同じです)。

49

ほとんどのプラットフォームでは、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ビットの値を印刷しているときに、頻繁に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

+0

@ M.M私は混乱を避けるために私の答えを明確にしました。 –

+2

明確にする:x86とx64より多くのアーキテクチャがあり、これらのアーキテクチャでは、char、short、int、longとlong longは異なる意味を持つ。例えば、16ビットのメモリアラインメントを有する32ビットのMCUは、以下を使用することができる。 char = short = int = 16ビット; long = 32ビット。 long long = 64ビット – AndresR

+0

@AndresR - 絶対に、組み込みプログラミングを行っている人にとっては非常に深いことです(私は一度火災警報用のカーネルモジュールを構築しました)。移植性のために書かれていないコードを使用しようとすると、それらの貧しい人々を哀れみます。 –

15

符号なしlongを参照している場合は、書式設定文字は"%lu"です。長い符号付きの場合は、書式設定文字は"%ld"です。