В чем разница между 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-битным.
Мартин Отто

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то , что есть вопросы , я мог бы столкнуться? Есть ли пример?
Шайют

70

ИНТ

Это примитивный тип данных, определенный в 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 via C #»:

int - это примитивный тип, разрешенный компилятором C #, тогда как Int32 - это тип библиотеки классов инфраструктуры (доступен для языков, которые соответствуют CLS). Фактически, int переводится в Int32 во время компиляции.

Также,

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

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

Я видел этого автора и много стандартной литературы по .NET, предпочитая типы FCL (т. Е. Int32) специфичным для языка примитивным типам (т. Е. Int), главным образом по таким вопросам совместимости.


8

Ничего. Единственная разница между типами - это их размер (и, следовательно, диапазон значений, которые они могут представлять).


8

Очень важное замечание по 16, 32 и 64 типам:

если вы выполните этот запрос ... Array.IndexOf (new 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 #, но, к вашему сведению, простой спецификатор типа решает эту проблему: 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 # неявно воскрешая intк longпри необходимости (а также поднимает shortАня intили long), но не будет неявно вниз, используя objectперегрузку вместо этого. С Option Strict Onили OffVB будет использовать типизированную перегрузку, только если предоставлены унифицированные типы, в противном случае она использует objectперегрузку.
Марк Херд

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

Это очень интересное и неожиданное поведение (так как int для длинных работ, но short для int нет), следовательно, upvote!
sth_Weird

7

РЕДАКТИРОВАТЬ: Это не совсем верно для C #, тег, который я пропустил, когда я ответил на этот вопрос - если есть более конкретный ответ C #, пожалуйста, проголосуйте за это!


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

Тем не менее, есть очень очень маленькая разница.

int16, int32 и int64 имеют фиксированный размер.

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


1
Это должен быть принятый ответ, так как это единственный ответ, который на самом деле правильный
mjs

2
Нет, это не так для C #. AC # int всегда имеет размер 32 бита. Для C да, вам приходилось сталкиваться с этой сложностью, и вы часто видите макросы в C-коде, чтобы иметь дело с переменными размерами int. См. Ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf стр. 18.
Ананке

@Ananke Ааа, пропустил тэг C #. Жаль, что я мог бы вернуть некоторые голоса на ответы .....
MJS

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

2
int не гарантированно будет 32 бит.
MJS

8
@mjs, это просто неправда. В C # intэто псевдоним для Int32и, следовательно, всегда гарантированно будет 32 бита.
Дэвид Арно

На самом деле то, что mjs говорит правильно, INT означает целое число, основанное на системе x86 или x64, поэтому, если ваша система x64, int будет Int64, поэтому не обязательно будет 32 .. Если вы введете int32 в x64, всегда будет int32 ,
Йогурту

5
Нет, то, что говорит Дэвид Арно, верно. Язык C # специально определяет «int» для обозначения 32-разрядного целого числа (Int32). Другие языки (C / C ++ и т. Д.) Могут не указывать это, но этот вопрос помечен как «C #».
Тео Бринкман

@TheoBrinkman Правильно, вот страница Microsoft о целочисленных числовых типах C #: 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.