sizeof(int) на x64?

Когато направя sizeof(int) в моя C#.NET проект, получавам върната стойност 4. Зададох типа на проекта на x64, така че защо пише 4 вместо 8? Това ли е защото изпълнявам управляван код?


person iheartcsharp    schedule 16.03.2009    source източник
comment
Неуправляемият код взема същото решение като .NET. В обикновен C++ sizeof(int) също е 4. Мислете за x64 като за разширение на 32-битова архитектура. По подразбиране все още е 32, вие просто получавате способността да обработвате също 64-битови данни.   -  person jalf    schedule 16.03.2009
comment
@jalf, за да бъдем по-точни, вече имахме способността да обработваме 64-битови данни, но x64 процесорите го правят по-бързо поради вградената поддръжка.   -  person Mr. TA    schedule 29.05.2012
comment
Защо това е затворено? Въпреки че е технически идентичен, другият въпрос е за Java, това е за .NET / C#.   -  person Christian.K    schedule 08.08.2012


Отговори (7)


Има различни 64-битови модели на данни; Microsoft използва LP64 за .NET: и двете дългоs и указателите са 64-битови (въпреки че указателите в стил C могат да се използват само в C# в unsafe контексти или като IntPtr стойност, която не може да се използва за аритметика на указател). Сравнете това с ILP64, където ints също са 64-битови.

Така на всички платформи int е 32-битова, а long 64-битова; можете да видите това в имената на основните типове System.Int32 и System.Int64.

person Ðаn    schedule 16.03.2009
comment
Трябва да редактирате отговора си, тъй като той е приет, за да бъде напълно правилен. Премахнете там, където казвате, въпреки че традиционните указатели в C-стил не съществуват .NET и подробно System.IntPtr зависи от архитектурата. - person fnieto - Fernando Nieto; 11.08.2009
comment
Можете да използвате указатели в стил C в C#, те просто трябва да бъдат направени в опасен контекст. Както каза fnieto, трябва да отбележите, че IntPtr наистина зависи от платформата, където sizeof(IntPtr)==4 в x86 & sizeof(IntPtr)==8 в x64. - person zezba9000; 06.12.2010

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

person Andrew Hare    schedule 16.03.2009
comment
Какво ще кажете за подравняването на границата на думата на процесора? Дори един Byte може да е 64-битов на x64. - person Dai; 09.09.2019

int означава Int32 на .NET езици. Това беше направено за съвместимост между 32- и 64-битови архитектури.

Ето таблица на всички типове в C# и какво съпоставят към .NET.

person Ben S    schedule 16.03.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
    }
person andleer    schedule 16.03.2009
comment
Или можете просто да проверите IntPtr.Size, който не изисква опасен код. - person Jim Mischel; 16.03.2009
comment
Добре е да се отбележи: UIntPtr не е CLS-съвместим. - person Andrew Hare; 16.03.2009

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

Значението на int все още е 4 байта, независимо дали сте на x86 или x64. Това означава, че int винаги ще съответства на System.Int32.

person Brian R. Bondy    schedule 16.03.2009

Не забравяйте, че int е просто псевдоним на компилатор за основния тип Int32. Като се има предвид, че трябва да е очевидно защо int е само 32 бита на 64-битова платформа.

person Brian Rasmussen    schedule 16.03.2009

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

Пример на Fiddle

person Shafeeq    schedule 15.02.2013
comment
Този въпрос беше зададен преди 3 години и вече има приет отговор. Вижте дали можете да предоставите отговори на скорошни въпроси, които все още нямат приет отговор. - person mcknz; 15.02.2013