Яка різниця між Int, Int16, Int32 та Int64?


Відповіді:


348

Кожен тип цілого числа має різний діапазон ємності зберігання

   Type      Capacity

   Int16 -- (-32,768 to +32,767)

   Int32 -- (-2,147,483,648 to +2,147,483,647)

   Int64 -- (-9,223,372,036,854,775,808 to +9,223,372,036,854,775,807)

Як заявив Джеймс Сазерленд у своїй відповіді :

intі Int32справді є синонімами; intбуде трохи більш звичним виглядом, Int32робить 32-розрядніші більш явними для тих, хто читає ваш код. Я був би схильний використовувати int там, де мені просто потрібне "ціле число", Int32де важливий розмір (криптографічний код, структури), тому майбутні технічні працівники будуть знати, що безпечно збільшити, intякщо потрібно, але слід подбати про зміну Int32змінних таким же чином .

Отриманий код буде ідентичним: різниця полягає лише у читанні чи появі коду.


1
Якщо ви знаєте, що значення не буде перевищувати 65,535 (підписано) або від -32,768 до 32 767 (без підпису), чи не було б краще визначити ціле число int16для збереження ресурсу пам'яті, а не просто використовувати int?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

8
int та int32 можуть бути синонімами, але вони не повинні бути. На сьогоднішній день більшість проданих систем є 64-бітовими, тоді як int буде 64 біт.
Martijn Otto

4
Для Меттью Т. Бейкера та інших людей, таких як я, хто прийшов сюди, намагаючись вирішити, що використовувати з точки зору продуктивності, вам слід ознайомитись із цією публікацією, яка передбачає, що Integer у багатьох випадках є більш ефективним, ніж Int16: stackoverflow.com/questions/129023/ net-integer-vs-int16
Тоні Л.

19
@MartijnOtto Питання позначено тегом C #. У C #, intце завжди Int32 , незалежно від системи. Можливо, ви думаєте про C ++?

9
@MattBaker: Загалом, на сучасних комп’ютерах int16 займає стільки місця, скільки int32 (а власне, int64), тому що для того, щоб більшість операцій були ефективними, ми прокладаємо навколо даних дані, щоб зробити доступ, вирівняний до 32 або 64 бітових меж (у 32 або 64 бітових режимах відповідно). Це тому, що нестандартний доступ на одних архітектурах смішно неефективний, а для інших неможливий.
Джоель

118

Єдина реальна різниця тут - розмір. Усі тут типи int мають підписані цілі значення, які мають різний розмір

  • Int16: 2 байти
  • Int32і int: 4 байти
  • Int64 : 8 байт

Є одна невелика різниця між іншими Int64та іншими. На 32-бітній платформі призначення Int64атомів зберігання не гарантується. Це гарантується для всіх інших типів.


Якщо я використовую, Int64з 32 bit Windows Operating Systemякими проблемами я можу зіткнутися? Чи є приклад?
shaijut

70

int

Це примітивний тип даних, визначений у C #.

Він відображений в Int32 типу FCL.

Він є типовим типом і представляє структуру System.Int32.

Він підписаний і займає 32 біти.

Він має мінімальне значення -2147483648 та максимальне значення +2147483647.

Int16

Це тип FCL.

У C # коротке відображено в Int16.

Це тип значення та представляють структуру System.Int16.

Він підписаний і займає 16 біт.

Він має мінімум -32768 та максимальне значення +32767.

Int32

Це тип FCL.

У C # int відображається на Int32.

Він є типовим типом і представляє структуру System.Int32.

Він підписаний і займає 32 біти.

Він має мінімальне значення -2147483648 та максимальне значення +2147483647.

Int64

Це тип FCL.

У C # long відображається на Int64.

Це тип значення і представляє структуру System.Int64.

Він підписаний і займає 64 біти.

Він має мінімальне значення –9,223,372,036,854,775,808 та максимальне значення 9,223,372,036,854,775,807.


Просто додати , що Int64тип даних може бути представлений з використанням Lабо lсуфікс в той час як Int16або Int32не мають суфікс в C #.
RBT

14

За словами Джефрі Ріхтера (одного з учасників розробки .NET Framework) книги "CLR через C #":

int - це примітивний тип, дозволений компілятором C #, тоді як Int32 - це тип бібліотеки Framework Class (доступний для мов, які дотримуються CLS). Фактично, int перекладається на Int32 під час компіляції.

Також,

У C # довгі карти на System.Int64, але іншою мовою програмування, довгі можуть відображатись на Int16 або Int32. Насправді, C ++ / CLI так само розглядають як Int32.

Насправді більшість мов (.NET) навіть довго не вважатимуться ключовим словом і не будуть компілювати код, який його використовує.

Я бачив цього автора, і багато стандартної літератури про .NET, що надає перевагу FCL-типам (тобто Int32) перед типовими для мови первісними типами (тобто, int), головним чином, щодо таких проблем інтероперабельності.


8

Нічого. Єдиною різницею між типами є їх розмір (а, отже, і діапазон значень, який вони можуть представляти).


8

Дуже важлива примітка про 16, 32 та 64 типи:

якщо запустити цей запит ... Array.IndexOf (новий Int16 [] {1,2,3}, 1)

ви, мабуть, отримаєте нуль (0), тому що ви запитуєте ... це 1 в масиві 1, 2 або 3. якщо ви отримаєте -1 як відповідь, це означає, що 1 не знаходиться в масиві 1, 2 або 3 .

Добре перевірте, що я знайшов: усі наведені нижче повинні дати вам 0, а не -1 (я протестував це у всіх версіях версій 2.0, 3.0, 3.5, 4.0)

C #:

Array.IndexOf(new Int16[]{1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32[]{1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64[]{1,2,3}, 1) = 0 (correct)

VB.NET:

Array.IndexOf(new Int16(){1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32(){1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64(){1,2,3}, 1) = -1 (not correct)

Отже, моя думка полягає в тому, що для порівняння Array.IndexOf довіряйте тільки Int32!


7
Щоб уточнити, чому перший приклад працює таким чином: перший буквальний 1, 2 і 3 неявно приведений для того, shortщоб їх помістити в масив, а другий буквальний 1 залишається як звичайний int. (int)1не рахується рівним (short)1, (short)2, (short)3, таким чином , результат дорівнює -1.

4
Існує аналогічне регулювання, доступне для версій C #, але FYI простий специфікатор типу виправляє цю проблему: Array.IndexOf(new Int16(){1,2,3}, 1S) Array.IndexOf(new Int32(){1,2,3}, 1I) Array.IndexOf(new Int64(){1,2,3}, 1L)усі працюють як очікувалося.
Марк Херд

1
А ті, хто не працює, використовували Object[],Objectперевантаження. C # неявно піднімає значення " inta", longколи це потрібно (а також піднімає "a short" intабо " long)", але не буде неявно скинутий, використовуючи objectзамість цього перевантаження. З Option Strict Onабо OffVB буде використовувати набране перевантаження лише тоді, коли надаються рівномірні типи, інакше він використовує objectперевантаження.
Марк Херд

Ваша відповідь вводить в оману. Код порівнює значення різних типів. Висновок for Array.IndexOf comparisons, only trust Int32!неправильний. Якщо ви приведете остаточний 1аргумент до відповідного типу масиву, він працює як очікувалося.
Дон Чедл

Це дуже цікава і несподівана поведінка (оскільки int до тривалих робіт, але коротко до int не робить), отже, підсумок!
sth_Weird

7

EDIT: Це не зовсім вірно для C #, тег, який я пропустив, коли відповідав на це запитання - якщо є більш конкретна відповідь на C #, будь ласка, проголосуйте за це!


Всі вони представляють цілі числа різних розмірів.

Однак є дуже маленька різниця.

int16, int32 та int64 усі мають фіксований розмір.

Розмір int залежить від архітектури, для якої ви компілюєте - специфікація C визначає лише int як більшу або рівну короткій, хоча на практиці це ширина процесора, на який ви орієнтуєтесь, який, ймовірно, 32-бітний, але ви повинні знати що це може бути не так.


1
Це має бути прийнята відповідь, оскільки це єдина, яка насправді правильна
міс

2
Ні, це не вірно для C #. Розмір AC # int завжди має 32 біти. Для C, так, вам довелося стикатися з цим ускладненням, і ви часто бачите макроси в коді C, щоб мати справу з змінними розмірами int. Див ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf стор.18
ананке

@Ananke Ahh, пропустив тег C #. Хочеться, щоб я міг повернути кілька голосів за відповіді .....
міс

6
  1. intі int32є одним і тим же (32-бітове ціле число)
  2. int16 короткий int (2 байти або 16 біт)
  3. int64 - довгий тип даних (8 байт або 64 біт)

2
int не гарантовано становить 32 біти.
MJS

8
@mjs, це просто неправда. У C # intє псевдонімом Int32і, таким чином, завжди гарантується, що він становить 32 біт.
Девід Арно

Насправді те, що говорить міс - це правильно, INT означає ціле число, засноване на системі x86 або x64, тому якщо ваша система x64, int буде Int64, тому не гарантується, що вона буде 32 .. Якщо ви помістите int32 в x64, завжди буде int32 .
Йогурту

5
Ні, те, що каже Девід Арно, є правильним. Мова C # конкретно визначає "int", щоб означати 32-бітове ціле число (Int32). Інші мови (C / C ++ тощо) можуть не вказати цього, але це питання позначено "C #".
Тео Брінкман

@TheoBrinkman Правильно, ось сторінка Microsoft про цілі числові типи C # s: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Макс

5

Вони обоє справді синоніми, однак я виявив невелику різницю між ними,

1) Ви не можете користуватися Int32під час створенняenum

enum Test : Int32
{ XXX = 1   // gives you compilation error
}

enum Test : int
{ XXX = 1   // Works fine
}

2) Int32підпадає під Декларацію системи. якщо ви видалите, using.Systemви отримаєте помилку компіляції, але не на випадокint


-8

Int = Int32 -> Оригінальний довгий тип

Int16 -> Оригінал int

Int64 -> Новий тип даних стає доступним після 64-бітових систем

"int" доступний лише для зворотної сумісності. Ми повинні реально використовувати нові типи int, щоб зробити наші програми більш точними.

---------------

Ще одна річ, яку я помітив на цьому шляху, - це те, що не існує класу, названого Intсхожим на Int16, Int32 та Int64. Усі корисні функції, як TryParseдля цілого числа, походять Int32.TryParse.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.