約 1 年前にプログラミングを学んで以来、私は多くのプログラムを作成してきました。なぜ 32 ビット マシンと 64 ビット マシンに別々のプログラムをダウンロードしなければならないのか、まったく理解できませんでした。1 台の 32 ビット マシンでプログラムを作成すると、64 ビット マシンで実行されます。私の質問は、プログラムのビット型を定義する C/C++ で何ができますか?
3 に答える
C/C++ プログラムを 32/64 ビットにするのは何ですか?
32 ビットであるか 64 ビットであるかは、ターゲット アーキテクチャなどの他の要素と共に、コンパイル/リンク時に組み込まれます。
1 台の 32 ビット マシンでプログラムを作成して、64 ビット マシンで実行する場合
OS が Windows で、アプリケーションを 32 ビット マシンでコンパイルし、32 ビットの実行可能ファイルを出力する (つまり、クロス コンパイルではない) と仮定すると、Windows にはWindows on Windows64 (WOW64) と呼ばれる 32 ビットを可能にするテクノロジがあります。 64 ビット オペレーティング システムで実行するコード。
32 ビット マシンと 64 ビット マシンで別々のプログラムをダウンロードしなければならない理由が理解できませんでした。
これは普遍的に当てはまるわけではなく、いくつかの個別のプログラムをダウンロードするだけで済みます。ドライバーのようなものは、カーネルとより密接に連携し、「ビットパリティ」を持つ必要があります。つまり、32 ビット オペレーティング システムを使用している場合は 32 ビット ドライバーが必要であり、64 ビット オペレーティング システムを使用している場合は 64 ビット ドライバーが必要です。
ほとんどの場合、WOW のおかげで 64 ビット Windows で 32 ビット アプリケーションを使用できます。
だから私の質問は、プログラムのビット型を定義する C/C++ で何ができますか?
何もない。それはコンパイラ次第です。
えっ、ほんとう?64 ビット マシンは、異なる CPU アーキテクチャで実行されます。ppc、arm、i386 など、古い最も有名な CPU のいくつかは z80 と 6502 です。それらは異なる命令セット (バイナリ) を実行します。一部の 64 ビット プロセッサは、広く普及している i386 CPU の命令セットを拡張または実行できます。
他の 64 ビット CPU では実行できない 64 ビット CPU があります。多くの命令が欠落しているため、64 ビット バイナリは 32 ビットと互換性がありません。一部の 64 ビット命令をサポートする 32 ビットについては聞いたことがありません。64ビットをサポートできないとCPUが遅くなるため、64ビットバイナリを実行しても意味がないため、それも役に立ちません。
C/C++ コンパイラはマシン (64 ビット、32 ビット、アーム、ppc など) の命令を生成し、命令 (バイナリとも呼ばれます) は異なります。機械に外国語を話すようなもので、機械は何をすべきか理解していません。
64 ビット マシンで、次の 2 つのビルドの出力を比較します。
g++ -Wall -Wextra -m32 bits.cpp
g++ -Wall -Wextra -m64 bits.cpp
#include <iostream>
int main() {
std::cout << sizeof(void*) << std::endl;
return 0;
}