• ベストアンサー

long型の定数の末尾にLを付ける意味

long型の変数に値を代入する時に、値の末尾に"l"または"L"を付けることが推奨されていますが、なぜLを付けるのでしょうか?Lを付けることによって何かが変わるのでしょうか?回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • S117
  • ベストアンサー率40% (18/45)
回答No.2

整数リテラルの型は、その値を表現できるint以上の最も小さい型になります。また、データの損失が起きないより大きな型への変換は暗黙に行われます。 というわけでリテラルを変数に代入する(初期化含む)だけなら必要ありません。 しかし演算をする場合には事情が変わります。 int未満の整数同士の演算は自動的にint型に拡張してから行われますが、結果がどうなろうとintより大きくはなりません。 intとlongが同じ幅の処理系だと違いがわかりませんので、longの代わりにlong longを使ってみましょう 注:INT_MAXは符号付きint型の最大値(<limits.h>に定義がある) #include <stdio.h> #include <limits.h> int main(void) { long long a, b; int m = INT_MAX; a = m + 10; b = m + 10LL; printf("a=%lld\nb=%lld\n", a, b); return 0; } aはオーバーフローにより結果がマイナスになります。 一方bはオーバーフローを起こさず、正常な結果が出ます。 これは、aでは演算を行う時点では単にint型を使用している為です。 一方、bでは計算時に10というリテラルがlong long型を指定されているので、演算がlong long型に拡張して行われます。 10LL は (long long)10 としてもいいですが、前者の方がずっとすっきりと書けます。

noname#113783
質問者

お礼

>>結果がどうなろうとintより大きくはなりません。 そうなんですか!成るほど。わかりました。 回答ありがとうございました!

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.3

代入なら、特に意味はないでしょう。 型を明確にすると言う人もいるのでしょうが、Cで扱う型は標準型だけじゃなくて、システムで定義された型やユーザが定義した型もあります。 time_t x = 0; size_t y = 0; my_type z = 0; とかのときに、Lを付けた方がいいのやら良くないのやら。 代入じゃなくて、演算のオペランドや関数引数の場合については#2の方のお書きの通り。 いずれにせよ小文字のエルは数字の1と見間違うと困るので、付けるなら大文字にしましょう。

noname#113783
質問者

お礼

>>いずれにせよ小文字のエルは数字の1と見間違う ですね。回答ありがとうございました!

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

C/C++は強く型付けされた言語です。 常に型を意識する必要があります。 >なぜLを付けるのでしょうか? 即値の型が(int)でなくlongであることを明示するためです。 32ビット処理系だとintもlongも大きさは全く同じなので、 有難味がわからないかも知れません。 しかし、64ビット処理系の中には intは32ビット、longは64ビットというように サイズが異なるものもあります。 また、16ビットの場合もintは16ビット、 longは32ビットというものがありました。 この場合、longの即値にLを付加することで、 intの変数への代入をコンパイラにチェックしてもらい、 バグの低減につながります。 C++の場合には、別の面があります。 C++では関数の多重定義が可能です。 void f(int n)と void f(long n) を別の関数として扱わせることができます。 この場合 f(10)ではintバージョンが呼ばれます。 longバージョンを呼びたいときは f(10L)と書く必要があります。

noname#113783
質問者

お礼

バグの低減なんですね。 まだ簡単なプログラムしか組めないませんが、大きいプログラムを組むようになるとそういうのが重要になってくるのでしょうか。 分かりました。回答ありがとうございました!

関連するQ&A

専門家に質問してみよう