web-dev-qa-db-ja.com

x64のsizeof(int)?

C#.NETプロジェクトでsizeof(int)を実行すると、戻り値4が返されます。プロジェクトタイプをx64に設定したのに、なぜ8ではなく4と表示されるのですか?これは、マネージコードを実行しているためですか?

44
iheartcsharp

さまざまな64ビットデータモデル ;があります。 Microsoftは LP64 を.NETに使用します:longとポインターの両方が64ビットです(ただし、CスタイルのポインターはC#でunsafeコンテキストで、またはIntPtr値として使用されますが、ポインター演算には使用できません)。 intも64ビットであるILP64とは対照的です。

したがって、すべてのプラットフォームで、intは32ビット、longは64ビットです。これは、基になる型System.Int32およびSystem.Int64の名前で確認できます。

41
Ðаn

キーワードintエイリアスSystem.Int32 64ビットマシンでも、4バイトが必要です。

50
Andrew Hare

int は、.NET言語ではInt32を意味します。これは、32ビットアーキテクチャと64ビットアーキテクチャ間の互換性のために行われました。

これが、C#の すべてのタイプのテーブル と、それらが.NETにマップするものです。

27
Ben S

Int32は、x86およびx64では4バイトです。 Int64はどちらの場合も8バイトです。 C#intタイプは、System.Int32の単なるエイリアスです。両方のランタイム環境で同じです。ランタイム環境に応じて変化する唯一のタイプはIntPtrです。

    unsafe
    {
        var size = sizeof(IntPtr); // 4 on x86 bit machines. 8 on x64
    }
17
andleer

intポインタまたはSystem.IntPtrを考えているかもしれません。これは、x64では8バイト、x86では4バイトです。ポインタのサイズは、メモリに64ビットのアドレスがあることを示しています。 (System.IntPtr.Size == 8 on x64)

intの意味は、x86でもx64でも、4バイトのままです。つまり、intは常にSystem.Int32に対応します。

13
Brian R. Bondy

intは、基本タイプInt32のコンパイラエイリアスにすぎません。 intが64ビットプラットフォームで32ビットに過ぎない理由は明らかであるはずです。

5
Brian Rasmussen
int i;
int size = BitConverter.GetBytes(i).GetLength(0);

フィドルサンプル

1
Shafeeq