電子書籍の厳選無料作品が豊富!

CPUが16bitでも32bitOSでコンパイルしたコード(例えばintが4バイトと定義されている)も問題なく動作するのですか?

int型のサイズはCPUではなく、OSとコンパイラによって決まりますという人がいて気になります。

A 回答 (7件)

16bit用のクロスコンパイラでコンパイルしたのであれば動きます。


普通に32bit用のコンパイラでコンパイルしたものは動きません。
    • good
    • 0
この回答へのお礼

じゃあ、OSとコンパイラだけで決まるのではなく、CPUとOSとコンパイラ全て合わさって決まるのが正しいんですかね?
ありがとうございます。

お礼日時:2024/06/25 08:14

> 結局コンパイラで何ビットにするかを決めてるのはOSやCPUを上手く動作させるためですよね。



そういうことではありません。intが32bitでも64bitでも、64bitCPUも64bitOSも上手く動くので、どっちでも良いのです。

むしろ重要なのは過去からの互換性です。
Windowsは、CPUもOSも、16bit→32bit→64bitと推移してきたのはご存じだと思いますが、Cのintは(ごく初期の記憶は無いですが)ずっと32bitなので、それに依存したプログラムがほとんどです。今、「CPUもOSも64bitなので、来年からMSのCはintを64にする。intが32のコンパイラは廃止してサポートしない」とかMSが言っちゃうと皆さん大変です。プログラム全部書き直しの検討。個人開発のフリーソフトだとそれをきっかけに公開中止・サポート中止になるかも。まあ、MS以外のCは32bitのままでしょうからそっちに切り替える選択肢もありますが。「そんなことになって、誰がどう嬉しいの?」ということで当面そういう事態にはならないでしょうね。
「int 32bitが未来永劫続くだろう」とまでは言い切れませんが。

intが何ビットかと全く関係ない別の概念として、EXEファイルには「32bitアプリ」「64bitアプリ」の区別があります。これはCのソースがどうなっているかとは関係なくて、EXEの形式というかプログラムでアクセスできる論理メモリのアドレス幅のことです。そもそもCやC++で書かれたプログラムとも限らないし。
64bitWindowsがメジャーになってからも数年はOfficeとかメジャーなウェブブラウザは32bitアプリが主流でした。これはどちらもアドインを追加して使うアプリのため、アドインがすべて64bitアプリ対応しないと、本体のみ64bitアプリをインストールすると32bitアプリのみのアドインがインストールできないからです。最近は大丈夫になったようでこれらも64bit版を使うのが普通です。
こういうのに比べると、intが32か64かとかはプログラム中の書き方だけに閉じたことで、どうでも良いことです。最近はint32_tやint64_t、int16_tのようにビット数指定の型もあるので、必要ならそういうのを使えば問題なし。intが32のコンパイラでもintを使わず全部int64_tを使えば(ライブラリ関数の引数や返値の型を除けば)intが64のコンパイラのEXEと同じです。
    • good
    • 0
この回答へのお礼

大丈夫?

お礼日時:2024/06/26 15:00

「intが何バイトか」は、CPUが何ビットかとか、OSが何ビットかとは何の関係もありません。

コンパイラだけで決まります。
8bitCPU(メモリアドレスは16bit) 8bitOS時代のCではintは2バイトと4バイトのコンパイラがそれぞれありました。OSやCPU関係なく、プログラムでどうとでもなる話です。(プログラムサイズや実行速度にはもちろん影響あり)

コンパイラによって、
・同じOSでしか動かないコードしか生成できない物
・同じ種類のOSでビット数だけ異なるOSでも動くコードも生成できる物
・Windowsでコンパイルするが、Linux専用のコードを生成できる物
などいろいろあるので、目的のOSで動くコードが生成できるかどうかはコンパイラのドキュメントを見るしか無いです。

他人に聞くなら、それぞれのOSの種類・バージョン、コンパイラ名とバージョンを書くと、特殊なOSやコンパイラでなければ、そのコンパイラに詳しい人がいれば回答くれるかもしれません。
いまどき16bitというと組み込み系OSですかね。私は組み込み系は知りませんが。
    • good
    • 1
この回答へのお礼

結局コンパイラで何ビットにするかを決めてるのはOSやCPUを上手く動作させるためですよね。

お礼日時:2024/06/26 11:43

コンパイラは「実行ファイルとして実行できるファイルを生成する」ものです。


コンパイラを実行しているCPU,OSは関係無く、どんな環境をターゲットにして実行ファイルを生成させたかに依存します。
実際にクロス開発と言って、コンパイル環境と実行環境が違う運用がされています。
(組込み用8bitCPU向けプログラムをWindowsで作成する、等)

> CPUが16bitでも32bitOSでコンパイルしたコード(例えばintが4バイトと定義されている)も問題なく動作するのですか?

どのCPU/OSでコンパイルしたかではなく、どのCPU/OSで動くことを目的にコンパイルしたか、によります。

> int型のサイズはCPUではなく、OSとコンパイラによって決まります

OSも関係ありません。
コンパイラとコンパイル時の設定で決まります。


実際は
・多くはクロス開発ではなく自環境向けの開発になる
・int等のサイズは仕様書には最小サイズだけで具体的な指定はなく、各コンパイラ製作者で「CPUが自然に扱えるサイズ」として決めている。
(それではサイズが環境によりバラバラになって困るので、後続の言語(Java等)ではint=32ビットと決めているものが多い)
・長い間32bitCPUが主流の時代が続いた

という状況にあります。
これらから
・intのサイズは(自環境である32bitCPU/OS向けに最適な)32bit
・(クロス開発などしたことが無いので) intのサイズを決めるのは(自環境である)CPUとOS
と誤解している方がいます。

関係しているのはコンパイラ(とライブラリ)だけです。
※ 実際にはコンパイラの動作環境とかライブラリの入手方法とかも関係しますが



ちなみに。
例えば intが4バイトと定義されているとしても、32bitCPU向けではレジスタとCPU命令で計算、8bitCPU向けには4バイトのメモリと32bit演算ライブラリを使って計算、とすれば、同じソースから異なるCPU向けに作ることができます。
    • good
    • 1

No.3です。


要するに、16bitCPUで32bit intは現実的でないが、32bitCPUで16bit intや、64bitCPUで32bit int/16bit intは実際にある。

・32bitCPUで16bit int
Windows3.1のころは当たり前だった。

・64bitCPUで32bit int
Visuual StudioのC++とかでは今でもこれが標準のハズ。

・64bitCPUで16bit int
Windowsが32bit版で、昔の16bitコンパイラを使った場合にできる。
    • good
    • 0

まず世の中にはクロスコンパイラというものがあって、コンパイラが動作する環境とコンパイルしてできた実行コードが動作する環境は必ずしも一致しないので、間違いがないように。



一般的に32bitCPU/OSで動かすようにコンパイルされた実行コードを16bitCPUで動かすことはできません。まあ高度なエミュレーターを作ってしまえば不可能ではないですけど。
ていうか32bitCPU/OS用の実行コードがそのまま動くCPUは16bitCPUではありません。特にC言語のint型はCPUが素直に計算できるビット幅の整数型なので、32bit intが使えるなら普通は32bitCPUですね。CPUのビット数は多分にマーケティング的な要素があるので16bitCPUと呼称する製品もあったかと思いますけど。

> int型のサイズはCPUではなく、OSとコンパイラによって決まります
これはIntel x86アーキテクチャの64bitCPUで顕著なものですね。今販売されている製品は64bitCPUですが、これらの製品は下位互換のために32/16bitCPUを動作モードとして含んでいます。それでOSとコンパイラによってintサイズは16/32/64bitに変わります。
古い16bitモード用のコードを生成するとintは16bitです。Windowsでは64bitOSでも基本intは32bitですが、Linuxだと64bit intのものがあります。
    • good
    • 0
この回答へのお礼

誤解を招く表現ということですか?
要するに最近のCPUはOSが決めたbitをひとかたまりとして使えるというわけで、そのことをOSとコンパイラが決めると表現されているのでしょうか?

お礼日時:2024/06/25 09:50

16ビット用に作られたコードなら動く。


OSに依存しない。
むしろコンパイラに依存する。

16ビットに非対応なコードでintを4バイトと定義しても16ビット向けのコードにはならない。
また、使用するDLLなども正しく16ビット用の物を指定しないとコンパイルできても動かない事がある。
    • good
    • 1
この回答へのお礼

じゃあ、コンパイラとCPUによって決まるというのが正しいのですか?
なぜOSは出てきたのでしょうか
ありがとうございます

お礼日時:2024/06/25 08:31

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A