• ベストアンサー

型について

Cの型の中にint と long int がありますけどこの違いは何なのでしょうか?本にはどちらも4ビットの整数(long intは長整数となっていますが)-2147486648~2147483647となっていますが・・。 同様にdouble と long double は何が違うのでしょうか? 初歩的なところですがよろしくおねがいします。

  • poyo3
  • お礼率66% (538/813)

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

各種類の値が何バイトになるのかはC言語としては決まっていません。 コンパイラによって色々です。intが2バイトでlong intが4バイトのものもあれば、intもlong intも4バイトのものもあれば、intが4バイトでlong intが8バイトのものもあります。 doubleとlong doubleも同じ関係。

poyo3
質問者

お礼

そういうものなんですか。相対的にint より long intの方が長くなるという感じなんですね。回答ありがとうございます。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ああそうそう, ・double が 8バイトで long double が 12バイト って環境はあった. ちなみに「int と long long int が一致する」ならその間に挟まれる long int も自動的にそれらに一致しますし, 「long long double」なる型は (規格には) 存在しません.

回答No.3

Cでデフォルトの型でもある「int」は、一番高速に計算できるビット数になります。 たいていの場合は、利用しているコンパイラが何ビットモードでコンパイルしているかに依存します。 「int」が「long int」に一致するというのならば、32bitのコンパイラで確認しているのでしょう。 もしも、これが64bitだった場合、「int」は「long long int」に一致することになります。 異なるビットの環境で動かない時というのは、こういった部分が原因している場合が多いです。 もしも、コーディングしていて、幅がかわったら困るような時は stdint.h をインクルードして int16_t など利用するとよいと思います。 あるいは、「int」でなく「short int」と記述するか。。。 「double」の方はわかりません。 でも、おそらくは同じ理由で64bitモードならば「long long double」に一致するのではないでしょうか。

poyo3
質問者

お礼

型もコンパイラにあわせて考えないといけないですね。 int自体の大きさも固定ではないのですね。回答ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

いかなる場合においても「long int は int より短かくない」し「long double は double より短かくない」ということ*だけ*は確実です. ただしこれらが違うかどうかは処理系に依存しますし, 具体的にこれらの型が何バイトであるかも規格には定められていません. ぶっちゃけていえば, 規格上は「long が 1バイトの環境」だってあっていい.

poyo3
質問者

お礼

やはり相対的なもので個々は決まってないということなんですね。 回答ありがとうございます。

関連するQ&A

  • C言語の変数の型がわかりません

    C言語の変数の型がわかりません [int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. [long int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. のようなことが書いてあります. [int]と[long int]の違いは何ですか?

  • 定数の型について

    独習Cという本に「デフォルトでは、Cコンパイラは数値定数を互換性のあるデータ型のうちその数が収まる最小の型であると見なします。intを16ビットと仮定すると、10はデフォルトでintとなり、100003はlongになります。」と書いてあるのですが、なぜ10はshortではなくintになるのですか? 回答お願い致します。

  • C/C++の型について

    Windows2000で、VC++6で型のサイズを調べると、以下のとおりでした。 int 4バイト long 4バイト long int 4バイト 環境はWindows2000, CPUはCeleron1200Mhzです。 環境やコンパイラによって型のサイズや呼び方も変わるのでしょうか? VisualBasic6用のDLLをVCで作成した記憶があるのですが、そのときは VB6のInteger型が2バイトだったので C(Ver7.0?????)側も2バイトだったと思います。 今VB6のInteger型にあわせる場合はC側ではshortでないとおかしくなるのでしょうか? 私はブランクがあり、そのあたりの事情がよくわかっていません。 あるサイトのページを見ると intが2バイトで、 long intは同じ4バイトで long long intという型もありました。VC6++では long long intは無いようです。 http://seclan.dll.jp/c99d/c99d05.htm VC2005++やGCCでは8バイトの型はあるのでしょうか?

  • 型指定子についての教えてください。

    コンパイラはMicrosoft visual C&C++を使用しています。 (1)型指定子のfloat,doubleの大きい数値について。 計算をするとfloatは7桁までは正しくて、7桁より大きい桁はデタラメです。doubleは15桁までは正しくて、15桁より大きい桁はデタラメです。有効数字7桁,15桁とはこういうことでしょうか。 後、floatは有効数字7桁、doubleは有効数字15桁で本当に正しいのでしょうか。 (2)型指定子のfloat,doubleの小数点以下の数字について。 floatは10^-38まで、doubleは10^-308までの数字を扱えると参考書には書いてありますが、計算をしますと小数点以下6桁までは求まりますが、それ以下は求まりまりません。それ以下の数値はすべて0になります。なぜでしょうか。 (3)int,long intとdouble long doubleの違いについて。 intとlong intはともに-2147483648~2147483647までの範囲だと思います。またdoubleとlong doubleはともに有効数字15桁でした。何か違いがあるのでしょうか?

  • 固定長なデータ型の定義

    int型などは可変長型なのでサイズは16ビット、32ビット、 64ビットなどC言語だと環境によって異なってきますよね? さらにlong型は32ビット64ビットの可変長でも、 long long型は64ビット固定長型であったり、 long int型は32ビットが保証値だとか、 shortを付けるとサイズが小さくなるのかだとか、 非常に煩わしいのでどの環境でも常に同じサイズで定義できるよう 全てtypedefで固定長にしたいと考えています。 (できれば__int32等は言語仕様では無いので使いたくないので…) ですが検索するとどうも情報が各サイトごとに微妙に違ってたりして 私には正しいかどうかの判断が付かなくなってしまいました。 (C言語以外もあったのでそのせいかもしれませんが;) 以下のように、8ビット、16ビット、32ビット、64ビット、 32ビット浮動小数、64ビット浮動小数を定義したいのですが どうかアドバイスをいただけないでしょうか? 宜しくお願い致します typedef int8   signed char; // -127~127 typedef int16  //16ビット固定整数 typedef int32  //32ビット固定整数 typedef int64  //64ビット固定整数 typedef dec32  //32ビット固定浮動小数 typedef dec64  //64ビット固定浮動小数

  • 型変換の質問

    どうしても考えてもわからないので投稿します。 Q1.以下の3つの型変換処理を実行せよ ・型変換(1)(int⇒String) ・型変換(2)(int⇒Double) ・型変換(3)(String⇒int) の、問題なのですがどうしても出力できません。 どなたか教えてください。

  • 型変換??

    int RANDOM_FUNCTION( int n ) { return (int)( rand() / (float)RAND_MAX * n ); } について Q1.この関数は0からn-1までの乱数を作るそうなのですが,何故ですか? 0<=rand()<=RAND_MAX だから0からnまでの乱数ができるような気がするのですが. Q2.RAND_MAXではなく(float)RAND_MAXとキャストしてある意味は何ですか? Q3.srand((unsigned)time(NULL));と srand((unsigned int)time(NULL));では何か違いますか? Q4.  static int first = 0; if (first == 0){ srand((unsigned)time(NULL)); first = 1; } という処理でsrand((unsigned)time(NULL));は最初の一回だけ呼び出されるようになっているようですが,この部分を srand((unsigned)time(NULL)); というように毎回呼び出すようにするとどうなりますか? 一回呼び出すだけで乱数系列の初期値が呼び出される時に変化しているのですか? Q5.この関数とは関係ない質問ですが,例えば a:int型 b:int型 c:double型 d:float型 のとき d = a / b + c という演算は 1 a:int型,b:int型より(a / b)の結果はint型(小数になった場合は小数点以下切り捨て) 2 (a / b):int型,c:double型,int<doubleより (a / b + c)の結果はdouble型 3 d:float型,『=のあるときは左辺の型に合わせる』よりdはfloat型 というように型変換されているという解釈でいいのでしょうか??

  • C言語で整数を文字列へ型変換

    C言語で整数を文字列へ型変換 int result[11]; const char *tmp; resultの中の11個の数字を 1,2,3,4,5,6,7,8,9,10,11 のような文字列にして、tmpへ代入したんですが、やり方が分かりません。 Cの初心者ですので、教えていただきたいです。

  • 変数の型変換

    追加質問ですみません。 double型をint型に変換したいんですが Integer.parseInt使っても、intValue使ってもできません。 っていうか、手元の本には、「Java言語では、自動的に型変換が行われて計算される」って書いてあるのに どうして変換されないんですか?

    • ベストアンサー
    • Java
  • c言語の変数の型について

    浮動小数点数の変数の型ってfloat、double、long doubleがありますよね?(その他もあったら教えてください) doubleはfloatの倍精度らしいですが、倍精度ってのは扱える数字の範囲が2倍なのか有効桁が2倍なのかわからないんで教えてほしいです。ちなみに、doubleとlong doubleの違いも判りません。 あと、これらの変数はprintfで出力するときは最高で8桁までしか出力できないんでしょうか?20桁とかは無理なんですかね?