sizeof (int) на x64? - PullRequest
       31

sizeof (int) на x64?

43 голосов
/ 16 марта 2009

Когда я делаю sizeof(int) в своем проекте C # .NET, я получаю возвращаемое значение 4. Я устанавливаю тип проекта на x64, так почему он говорит 4 вместо 8? Это потому, что я запускаю управляемый код?

Ответы [ 7 ]

50 голосов
/ 16 марта 2009

Ключевое слово int aliases System.Int32, которое по-прежнему требует 4 байта, даже на 64-разрядной машине.

39 голосов
/ 17 марта 2009

Существует различных 64-битных моделей данных ; Microsoft использует LP64 для .NET: и long s, и указатели являются 64-разрядными (хотя традиционных указателей в стиле C не существует .NET). Сравните это с ILP64, где int s также 64-битные.

Таким образом, на всех платформах int является 32-разрядным, а long - 64-разрядным; Вы можете увидеть это в именах базовых типов System.Int32 и System.Int64 .

26 голосов
/ 16 марта 2009

int означает Int32 на языках .NET. Это было сделано для совместимости между 32- и 64-разрядными архитектурами.

Вот таблица всех типов в C # и того, что они сопоставляют с .NET.

17 голосов
/ 16 марта 2009

Int32 - 4 байта на x86 и x64. Int64 составляет 8 байтов в любом случае. Тип C # int - это просто псевдоним для System.Int32. То же самое в обеих средах выполнения. Единственный тип, который меняется в зависимости от среды выполнения, это IntPtr:

    unsafe
    {
        var size = sizeof(IntPtr); // 4 on x86 bit machines. 8 on x64
    }
13 голосов
/ 16 марта 2009

Возможно, вы думаете о int указателе или System.IntPtr. Это будет 8 байтов на x64 и 4 байта на x86. Размер указателя показывает, что у вас есть 64-битные адреса для вашей памяти. (System.IntPtr.Size == 8 на x64)

Значение int равно 4 байтам, независимо от того, используете вы x86 или x64. То есть int всегда будет соответствовать System.Int32.

5 голосов
/ 16 марта 2009

Помните, int это просто псевдоним компилятора для базового типа Int32. Учитывая, что должно быть очевидно, почему int - это только 32 бита на 64-битной платформе.

1 голос
/ 15 февраля 2013
int i;
int size = BitConverter.GetBytes(i).GetLength(0);

Образец скрипки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...