• ベストアンサー

512Lや1024L等の「L」について

コンパイル:gcc 言語:c OS : Linux といった環境でプログラミングの勉強をしているものです。 最近、あるサイズのブロック単位でディスクからreadするソースコードを読んでいたときに、次のようなサイズ数の後に大文字の「L」をつける表記を見つけました。 read (fd, buf, 512L * 1024L); 僕が書くとしたら、 read (fd, buf, 512 * 1024); となるところですが、なぜ512Lや、1024Lといった表記をするのか理由が調べてもわかりません。webで検索をかけるにしても、どういったキーワードで探せばいいかも分かりませでした。 この理由を、どなたか教えてください。 お願いします。

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

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

確かに検索ではヒットしそうにない内容ですね(笑) 後置のLがlong型定数を表すことは既回答のとおりです。 C言語では、算術演算子(【*】等)の演算結果の型は演算前の値の型で決まります。例えば a * b の場合、計算結果はaとbのうち「より広いほうの型」(ちょっと定義は面倒くさいので直感的な表現にしておきます)で返されます。 ですので、aとbの型が同じ場合はその同じ型で値が返されることになります。 Lなしの整数定数はint型なので、512 * 1024の計算結果もint型で返されます。ところが512 * 1024の「本来欲しい値」は524288で、intが16ビットの場合はintの範囲を超えてしまい正しい値が得られません。 片方にLを付けてlong型定数にすると、計算結果はlong型で返されるので、intが16ビットの場合でも(longが32ビット以上であれば)正しい値が得られることになります。

r3dpin3
質問者

お礼

a*bのうち「より広いほうの型」で返されるという点は、自分でさらに調べていこうと思います。 実は、webでキーワード「1024L」で検索したとき、英語のページでしたが、「512 * 1024L」といった表記をみかけ、おやっと思っていました。 ありがとうございました。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

Lは整数定数の接尾辞で、その定数がlong型であることを指定します。 ソースの意図は、おそらく512*1024が16ビットでは収まらないため、移植性に配慮してlongにしたものと思われます(int型は16ビット以上なので)。ただ、read関数の第3引数はsize_tであり、intが16ビットならsize_tも16ビットになることが十分予想されるので、あまり有効な対処とはいえません。 > webで検索をかけるにしても、どういったキーワードで探せばいいかも分かりませでした。 この類の情報は個別に検索して見つけることは困難です。やはり、言語仕様を基礎からしっかり学習することをお勧めします。

r3dpin3
質問者

お礼

K&R第2版を調べて、整定数について熟読した次第です。 これまでは、charは1byte、intは4byteといった入門書的な知識でこなしてきたことを恥しく感じます。 read関数で第3引数がsize_tにより、L定数をしてもあまり有効ではないという点は、興味がわきました。 ありがとうございました。

  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.1

Lは long 型の定数であることを示します。 int が16ビット整数、shortが16ビット整数、longが32ビット整数である処理系の場合、Lをつけないと16ビット整数と見なされてしまい、それでは 512 * 1024 = 524288という数は表現できないので、Lをつけているのだと思います。

r3dpin3
質問者

お礼

一番の回答ありがとうございました。 long型定数であることがすぐに分かり、これをキーワードに文献で索引をひくことができました。

関連するQ&A

専門家に質問してみよう