1つだけ過去を変えられるとしたら?

コンパイル:gcc
言語:c
OS : Linux
といった環境でプログラミングの勉強をしているものです。

最近、あるサイズのブロック単位でディスクからreadするソースコードを読んでいたときに、次のようなサイズ数の後に大文字の「L」をつける表記を見つけました。

read (fd, buf, 512L * 1024L);

僕が書くとしたら、
read (fd, buf, 512 * 1024);

となるところですが、なぜ512Lや、1024Lといった表記をするのか理由が調べてもわかりません。webで検索をかけるにしても、どういったキーワードで探せばいいかも分かりませでした。

この理由を、どなたか教えてください。
お願いします。

A 回答 (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ビット以上であれば)正しい値が得られることになります。
    • good
    • 0
この回答へのお礼

a*bのうち「より広いほうの型」で返されるという点は、自分でさらに調べていこうと思います。

実は、webでキーワード「1024L」で検索したとき、英語のページでしたが、「512 * 1024L」といった表記をみかけ、おやっと思っていました。

ありがとうございました。

お礼日時:2005/09/04 01:36

Lは整数定数の接尾辞で、その定数がlong型であることを指定します。



ソースの意図は、おそらく512*1024が16ビットでは収まらないため、移植性に配慮してlongにしたものと思われます(int型は16ビット以上なので)。ただ、read関数の第3引数はsize_tであり、intが16ビットならsize_tも16ビットになることが十分予想されるので、あまり有効な対処とはいえません。

> webで検索をかけるにしても、どういったキーワードで探せばいいかも分かりませでした。

この類の情報は個別に検索して見つけることは困難です。やはり、言語仕様を基礎からしっかり学習することをお勧めします。
    • good
    • 0
この回答へのお礼

K&R第2版を調べて、整定数について熟読した次第です。
これまでは、charは1byte、intは4byteといった入門書的な知識でこなしてきたことを恥しく感じます。

read関数で第3引数がsize_tにより、L定数をしてもあまり有効ではないという点は、興味がわきました。

ありがとうございました。

お礼日時:2005/09/04 01:32

Lは long 型の定数であることを示します。



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

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

お礼日時:2005/09/04 01:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報