У чому різниця між int
, System.Int16
, System.Int32
і System.Int64
інші , ніж їх розміри?
У чому різниця між int
, System.Int16
, System.Int32
і System.Int64
інші , ніж їх розміри?
Відповіді:
Кожен тип цілого числа має різний діапазон ємності зберігання
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
змінних таким же чином .Отриманий код буде ідентичним: різниця полягає лише у читанні чи появі коду.
int
це завжди Int32
, незалежно від системи. Можливо, ви думаєте про C ++?
Єдина реальна різниця тут - розмір. Усі тут типи int мають підписані цілі значення, які мають різний розмір
Int16
: 2 байтиInt32
і int
: 4 байтиInt64
: 8 байтЄ одна невелика різниця між іншими Int64
та іншими. На 32-бітній платформі призначення Int64
атомів зберігання не гарантується. Це гарантується для всіх інших типів.
Int64
з 32 bit Windows Operating System
якими проблемами я можу зіткнутися? Чи є приклад?
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 #.
За словами Джефрі Ріхтера (одного з учасників розробки .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), головним чином, щодо таких проблем інтероперабельності.
Нічого. Єдиною різницею між типами є їх розмір (а, отже, і діапазон значень, який вони можуть представляти).
Дуже важлива примітка про 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!
short
щоб їх помістити в масив, а другий буквальний 1 залишається як звичайний int
. (int)1
не рахується рівним (short)1
, (short)2
, (short)3
, таким чином , результат дорівнює -1.
Array.IndexOf(new Int16(){1,2,3}, 1S)
Array.IndexOf(new Int32(){1,2,3}, 1I)
Array.IndexOf(new Int64(){1,2,3}, 1L)
усі працюють як очікувалося.
Object[],Object
перевантаження. C # неявно піднімає значення " int
a", long
коли це потрібно (а також піднімає "a short
" int
або " long
)", але не буде неявно скинутий, використовуючи object
замість цього перевантаження. З Option Strict On
або Off
VB буде використовувати набране перевантаження лише тоді, коли надаються рівномірні типи, інакше він використовує object
перевантаження.
for Array.IndexOf comparisons, only trust Int32!
неправильний. Якщо ви приведете остаточний 1
аргумент до відповідного типу масиву, він працює як очікувалося.
EDIT: Це не зовсім вірно для C #, тег, який я пропустив, коли відповідав на це запитання - якщо є більш конкретна відповідь на C #, будь ласка, проголосуйте за це!
Всі вони представляють цілі числа різних розмірів.
Однак є дуже маленька різниця.
int16, int32 та int64 усі мають фіксований розмір.
Розмір int залежить від архітектури, для якої ви компілюєте - специфікація C визначає лише int як більшу або рівну короткій, хоча на практиці це ширина процесора, на який ви орієнтуєтесь, який, ймовірно, 32-бітний, але ви повинні знати що це може бути не так.
int
і int32
є одним і тим же (32-бітове ціле число)int16
короткий int (2 байти або 16 біт)int64
- довгий тип даних (8 байт або 64 біт)int
є псевдонімом Int32
і, таким чином, завжди гарантується, що він становить 32 біт.
Вони обоє справді синоніми, однак я виявив невелику різницю між ними,
1) Ви не можете користуватися Int32
під час створенняenum
enum Test : Int32
{ XXX = 1 // gives you compilation error
}
enum Test : int
{ XXX = 1 // Works fine
}
2) Int32
підпадає під Декларацію системи. якщо ви видалите, using.System
ви отримаєте помилку компіляції, але не на випадокint
Int = Int32 -> Оригінальний довгий тип
Int16 -> Оригінал int
Int64 -> Новий тип даних стає доступним після 64-бітових систем
"int" доступний лише для зворотної сумісності. Ми повинні реально використовувати нові типи int, щоб зробити наші програми більш точними.
---------------
Ще одна річ, яку я помітив на цьому шляху, - це те, що не існує класу, названого Int
схожим на Int16, Int32 та Int64. Усі корисні функції, як TryParse
для цілого числа, походять Int32.TryParse
.
int16
для збереження ресурсу пам'яті, а не просто використовуватиint
?