2020年11月10日
川俣晶の縁側ソフトウェアC# コーディング How To total 1369 count

【入門級】32bit環境か64bit環境か判定する

Written By: 川俣 晶連絡先

 現在プログラムが64bit OSで実行中であるか否かは、Environment.Is64BitOperatingSystemで簡単に判定できます。

 しかし、64bit OSでも32bitプロセスで実行してしまう可能性があります。

 プロセスが64bitか否かはEnvironment.Is64BitProcessで簡単に判定できます。

 これとは別にポインターのサイズが32bitから64bitか調べる方法もあります。IntPtr.Sizeの値が4なら32bit、8なら64bitです。

 ただ、プロセスが64bitならポインターも64bitという前提を置いても現状では問題ないので、あまり使う機会はないかもしれません。

罠の数々 §

  • 通常、【OSのビット数≠プロセスのビット数≠ポインターのビット数】となる。たとえば64bit OSで32bitのプロセスを実行することは普通だし、昔の8bit CPUならポインターは16bitである。しかし、煩雑なのでイコールと見なして運用することが多い。しかし、多いだけで必ずそうとも言い切れない。注意しておこう
  • 通常C#のプログラマーはポインターを意識する必要はない。しかし、ポインターのサイズは参照を保存するために必要なメモリサイズに直結するので、ポインターのサイズを意識することはメモリ節約につながる

参考リンク §

Environment.Is64BitOperatingSystem プロパティ

Environment.Is64BitProcess プロパティ

IntPtr.Size プロパティ

 上の2つはEnvironmentクラスなのに、最後の1つはIntPtrクラスである。なぜIntPtr.Size プロパティだけクラスが違うのだろうか。上記のリンクを辿って理由を考えてみよう。

リポジトリ §

https://github.com/autumn009/cshowto

Environment §

using System;

class Program

{

    static void Main()

    {

        bool is64bitOS = Environment.Is64BitOperatingSystem;

        bool is64bitProcess = Environment.Is64BitProcess;

        bool is64bitPointer = IntPtr.Size == 8;

        Console.WriteLine((is64bitOS? "64":"32")+"bit OSです。");

        Console.WriteLine((is64bitProcess ? "64" : "32") + "bit プロセスです。");

        Console.WriteLine((is64bitPointer ? "64" : "32") + "bit ポインターです。");

    }

}

実行結果 (実行する環境で変化する)

64bit OSです。

64bit プロセスです。

64bit ポインターです。

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?