long型とか・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nn

long型とか・・・

#1

投稿記事 by nn » 16年前

long型というのはint型が4バイトであるのにたいして、
8バイトの整数型の変数という理解のしかたでいいのでしょうか?
また、同じくshort型は2バイトの整数型の変数でいいのでしょうか?
もう1つの質問として、
long a=1000000L;
という代入文があったのですが、Lは何を表わしているのでしょうか?

御津凪

Re:long型とか・・・

#2

投稿記事 by 御津凪 » 16年前

多くの32bit系コンパイラは、 int 型も long 型も 4 バイトの整数型をあらわします。
printf("int型のサイズは %d バイト。\n", sizeof(int));
のようにすると簡単にサイズを調べられますよ。

> long a=1000000L;

L は 定数値が long 型である、ということを示します。(デフォルトでは int 型か左辺値に合わせられるはず)
他にも、 UL(unsigned long)、 LL(__int64 等、8バイト整数型)、ULL(unsigned __int64)、F(float)
があります。
(ちなみに小文字でもOKです)

Mist

Re:long型とか・・・

#3

投稿記事 by Mist » 16年前

> long型というのはint型が4バイトであるのにたいして、
> 8バイトの整数型の変数という理解のしかたでいいのでしょうか?

違います。
char型を除いて変数の大きさは決められていません。
大小関係のみが定義されています。
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

char型は1バイトですが、その他の変数のサイズは環境によります。
現在、一般的な32bit環境では以下の通りです。

sizeof(short)=2
sizeof(int)=4
sizeof(long)=4

> long a=1000000L;

数値がlong型であることを示します。

たかぎ

Re:long型とか・・・

#4

投稿記事 by たかぎ » 16年前

char型は常に1バイトですが、それが何ビットであるかは処理系に依存します。

> Lは何を表わしているのでしょうか?

少なくともlong型以上であることを表します。
C90およびC++と、C90では振る舞いが微妙に異なるので要注意です。

C90/C++では、Lを付加した整数定数がlong型の表現範囲であればlong型に、そうでなければunsigned long型になります。
C90では、Lを付加した10進整数定数がlong型の表現範囲であればlong型に、long long型の表現範囲であればlong long型に、そうでなければunsigned long long型になります。8進または16進整数定数の場合、long型の表現範囲であればlong型に、unsigned long型の表現範囲であればunsigned long型に、long long型の表現範囲であればlong long型に、そうでなければunsigned long long型になります。

nn

Re:long型とか・・・

#5

投稿記事 by nn » 16年前

回答ありがとうございます。
long a=100000L;と書かなければ、aはint型として扱われるということでしょうか。
long型というのはintより大きい数字が入れられるものと思っていたのですが、
sizeofで同じ4バイトということはlongの存在意義がいまいちわかりません。
Javaなんかではlong型を返すメソッドもあるくらいなので意味はあると思うのですが、
longの存在意義は何なのでしょうか?

ねこ

Re:long型とか・・・

#6

投稿記事 by ねこ » 16年前

他の方のレスの中にもちらほらありますが
int型が4バイトなのは32ビット環境の場合になります。
今はもうほとんど無いと思いますが16ビット環境だと2バイトになります。
int型は環境によってサイズが可変するという事です。

現状では違いが無いためあまり意識されませんが
-32768~32767の範囲ならint型、それを超える範囲ならlong型を使って
「格納する値の範囲」を明示する意味合い程度はあります。

<long a=100000L;と書かなければ、aはint型として扱われるということでしょうか。
うろ覚えですが確か何も書かない時はlongだったような・・・
int型を引数にしていて直値(1000000とか)で引数に指定すると警告出た気がします。

sizuma

Re:long型とか・・・

#7

投稿記事 by sizuma » 16年前

javaではlong型は64ビットです。

>long
大きな数字を扱うときに使うかも?Javaでは。
32ビットは20億ぐらいでしたか。叶姉妹が使うおこずかい管理プログラムを作るときは使えそうですね。
僕はlong型使ったことないですが・・・



追記
誤植を一部訂正しました。

たかぎ

Re:long型とか・・・

#8

投稿記事 by たかぎ » 16年前

> long a=100000L;と書かなければ、aはint型として扱われるということでしょうか。

100000Lではなく100000と書いた場合、この定数がint型になるかlong型になるかは処理系によります。
それに関わらず、aはlong型として宣言していますのでlong型になります。
整数定数がどんな型になるかは、
http://www.kijineko.co.jp/tech/creintro ... f-int.html
を参照してください。

ちなみに、int型が16ビットの処理系は今でも普通にあります。
PCだけを見ていると分からないかもしれませんが...

> long型というのはintより大きい数字が入れられるものと思っていたのですが、

処理系によります。int型が32ビットでlong型が64ビットもありますので。
また、C++の場合、サイズが同じでも異なる型ですので、多重定義が可能になります。

toyo

Re:long型とか・・・

#9

投稿記事 by toyo » 16年前

>longの存在意義は何なのでしょうか?
http://www.kouno.jp/home/c_faq/c1.html
から引用
--------------------------------------------
どの整数型を使えばよいか、どうやって決めればよいか。

A:
大きな値(32767より大きな値か、-32767より小さい値)が必要なら longを使う。もしメモリの効率を気にするなら(例:大きな配列がある とか構造体がたくさんあるなど)shortを使う。どうでもいいならint を使う。オーバーフローの時の性質の明確なことが大事で負の値が不 要なら、対応する符号なしの整数を使え(ただし符号付と符号なしの 整数の混在には注意すること)。
--------------------------------------------

nn

Re:long型とか・・・

#10

投稿記事 by nn » 16年前

うやむやにしていた部分が解決できました。
環境や言語によって多少違いがあるみたいですが、
intとlongの違いがわかりました。
メモリー効率などまだそんなことを気にしてプログラムを組む
レベルではないのですが、頭に入れておきながら今後も取り組んで
行きたいと思います。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る