• ベストアンサー

【C言語】 型のサイズについて

C言語の学習をしております初心者です。 型のサイズについてですが、int型のサイズは処理系に依存する、 ということをよく聞きますが、この「処理系」というのは そのアプリケーションを動作させるマシンに搭載されている"CPU"を 指しているのでしょうか? それとも"OS"を指しているのでしょうか?

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

既にあるように、同じOSやCPUのマシンでも、intサイズが違うコンパイラはあります。 処理系定義の原文は、implementation-definedです。 訳文だと分かりにくいですが、つまり「言語仕様に対する"実装(implementation)"」が決めることであって、 ここでいう処理系というのは、一般にコンパイラ(と標準ライブラリ)を指します。 implementation-definedを決定するのは、コンパイラ(や標準ライブラリ)の作者です。 (逆に言うと、作者はこれらを決めなければいけません) まぁ、intサイズの場合、execution environmentに依存するので、 *コンパイラの作者* が、対応するOSやらCPUやらを考慮して決定すると思いますので、 たいていの場合は同じCPU、OS用のコンパイラは同じような値になりますが。

masy0312
質問者

お礼

非常に参考になりました。 ありがとうございます!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

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

C言語でいう「処理系」は、大きく分けて「翻訳処理系」と「実行処理系」に分けられます。「翻訳処理系」はいわゆるコンパイラのことですし、「実行処理系」はプラットフォーム(CPUやOSなど)のことです。 一般に「処理系」という場合はこれら両方の総称です。 たとえば、「処理系はGCCです」といっても、それはコンパイラの名前ですので、ターゲットが分かりません。GCCはWindowsやLinuxなどのほか、組込み機器でも使用されるからです。

masy0312
質問者

お礼

「処理系」にも分類があるんですね。 参考になりました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

処理系はコンパイラを指す。 同じCPU、同じOSでもコンパイラが異なればintサイズが変わることはある。また同じコンパイラでも設定により変わることがある。

masy0312
質問者

お礼

了解しました。ありがとうございます!!

全文を見る
すると、全ての回答が全文表示されます。
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

処理系の「系」は、 goo辞書 - 系 http://dictionary.goo.ne.jp/search.php?MT=%B7%CF&kind=jn&mode=0&base=1&row=0 | (1)ある関係のもとにつながった統一体。体系。 | (4)〔system〕物理・化学・生物などの分野で、一定の相互作用や相互連関のもとにある、もしくはあると想定されるものから成る全体。力学系・生態系・神経系・開放系など。 CPUもOSも含めたシステムの全体を指しますので、どちらかという事ではないです。 一般的には、概ねCPUを指す場合が多いですが、同じCPUでOSなりビルド環境なりを変更すれば、int型のサイズが違うって環境を作り出せなくは無いかと。 CPUの中での、いわゆるレジスタなんかのサイズは決まっている場合が多いですので、小さいint型のサイズを定義した場合には、レジスタの一部のみしか使ってないような事にもなるかも知れませんが…。

masy0312
質問者

お礼

なるほどですね。ありがとうございます!!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

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

  • C言語の定数のサフィックスについて

    C言語に詳しい方はおバカな質問をしていると思われるかもしれませんが、当方はソフトは初心者なのでご容赦ください。 C言語で定数を扱う際に一定以上のサイズの定数の場合L、UL等のサフィックスを付けないと正常に処理されない(例:0x0123456789ABCDEFという定数はサフィックス無しだと0x89ABCDEFとして処理される)仕様になっている事は把握しているのですが、この一定サイズについてご教授願います。 int、long等は処理系によってサイズが何bitになるかが変わりますが、intが16bitの場合は32bitの定数でもサフィックスにL、UL等を付けなければいけないのでしょうか? それともintのサイズに関係なく32bit以下ならサフィックスは不要で、32bitを超える場合はサフィックスが必要になるのでしょうか? また、処理系に依存せず一定のサイズの変数を宣言するのにint32_t、int64_t等がありますが、サフィックスにも同様に処理系に依存せずサイズを明確にする物はあるのでしょうか? 例えば0x0123456789ABCDEFULLとした場合、long longが32bitの場合は32bitの定数として扱われてしまうと思うのですが、定数を処理系に依存せずに確実に64bitとして処理してほしい場合はどの様にすれば良いのでしょうか? (あるサイトに"GCCではlong longが64bitのサイズになるが言語仕様上はビット長は保証されていない"と言う記載があった事から、サフィクスにLLやULLを使用しても64bitで処理される保証が無いと思い、この質問をさせて頂いています。)

  • c言語 型変換について

    c言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1

  • 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バイトの型はあるのでしょうか?

  • 誤った型の組み合わせとは?

    C言語初心者です。「FILEとintは誤った型の組み合わせです」と出てしまうのですが、その原因として考えられることにはどんなことがありますか?

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

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

  • C言語の型による処理速度の違い

    short int型よりint型。float型よりdouble型の方が 扱えるサイズは広いにも関わらず処理速度が速いと 聞いたのですが、それは本当でしょうか? もしそうならなぜそうなるのでしょう? (一度BCCでfloatとdoubleの処理速度を計ったらfloatの 方が少し早かったですが・・) 高速なプログラムを書く必要の出たときのために型に よる処理速度を教えてください。

  • C++言語のポインタについて

    現在、C++言語を学習しているのですが、 ポインタを使わない、 int main() { Human human; human.Introduction(); } と、ポインタを使った、 int main() { Human *p; p = new Human; p->Introduction(); delete p; } があります。どちらも同じ動作をしますが、ポインタを使ったものがよく使われているのは、 メモリの節約?動作速度?のためなのでしょうか? なぜ使われるのか教えてください。

  • C言語について

    C言語初心者です。 「かんたんC言語」という書籍で学習しております。 コマンドプロンプトでのプログラムの実行方法がよくわかりません。 教えて頂けないでしょうか?

  • C言語

    今C言語の基本について学習しているのですが… 初心者なのでまったくわかりません。 #include<stdio.h> int main() char *p,*q; char s[27]="abcdefghijklmnopqrstuvwxyz" char h[5]="GHIJK" 【 】 printf("%c"\n,p); printf("%c"\n,q); return(0); } この【 】の中に何がくるのか分かる方がいたらぜひ教えてほしいですm(__)m よろしくおねがいします。