C#.NETプロジェクトでsizeof(int)
を実行すると、戻り値4が返されます。プロジェクトタイプをx64に設定したのに、なぜ8ではなく4と表示されるのですか?これは、マネージコードを実行しているためですか?
さまざまな64ビットデータモデル ;があります。 Microsoftは LP64 を.NETに使用します:longとポインターの両方が64ビットです(ただし、CスタイルのポインターはC#でunsafe
コンテキストで、またはIntPtr
値として使用されますが、ポインター演算には使用できません)。 intも64ビットであるILP64とは対照的です。
したがって、すべてのプラットフォームで、int
は32ビット、long
は64ビットです。これは、基になる型System.Int32
およびSystem.Int64
の名前で確認できます。
キーワードint
エイリアスSystem.Int32
64ビットマシンでも、4バイトが必要です。
int
は、.NET言語ではInt32
を意味します。これは、32ビットアーキテクチャと64ビットアーキテクチャ間の互換性のために行われました。
これが、C#の すべてのタイプのテーブル と、それらが.NETにマップするものです。
Int32
は、x86およびx64では4バイトです。 Int64
はどちらの場合も8バイトです。 C#int
タイプは、System.Int32
の単なるエイリアスです。両方のランタイム環境で同じです。ランタイム環境に応じて変化する唯一のタイプはIntPtr
です。
unsafe
{
var size = sizeof(IntPtr); // 4 on x86 bit machines. 8 on x64
}
int
ポインタまたはSystem.IntPtr
を考えているかもしれません。これは、x64では8バイト、x86では4バイトです。ポインタのサイズは、メモリに64ビットのアドレスがあることを示しています。 (System.IntPtr.Size
== 8 on x64)
int
の意味は、x86でもx64でも、4バイトのままです。つまり、int
は常にSystem.Int32
に対応します。
int
は、基本タイプInt32
のコンパイラエイリアスにすぎません。 int
が64ビットプラットフォームで32ビットに過ぎない理由は明らかであるはずです。
int i;
int size = BitConverter.GetBytes(i).GetLength(0);