C#, як і багато статично типізованих мов, надає низку типів, що представляють цілі числа, і кожен із них має власний діапазон значень. На нижньому краї діапазону тип sbyte має мінімальне значення -128 і максимальне значення 127. Як і для всіх цілочисельних типів, ці значення доступні як <type>.MinValue і <type>.MaxValue. На верхньому краї тип long має мінімальне значення -9 223 372 036 854 775 808 і максимальне значення 9 223 372 036 854 775 807. Між ними розташовані типи short і int.
Кожен із наведених типів має відповідник без знака: sbyte/byte, short/ushort, int/uint і long/ulong. У всіх випадках діапазон значень становить від 0 до максимуму відповідного знакового типу, помноженого на 2, плюс 1.
Значення беззнакових цілочисельних типів подаються у простому двійковому представленні. Значення знакових типів використовують представлення знакових чисел у доповняльному коді.
Така кількість цілочисельних типів відображає архітектури машин: розмір регістрів, розмір аргументів команд процесора і трактування знака всередині процесора. Значення типу long займає 64 біти, тоді як значення типу sbyte займає 8 біт. У деяких випадках це впливатиме на швидкодію процесора, використання памʼяті й навіть на використання диска (там, де вибір меншого цілочисельного типу зазвичай буде вигіднішим). Вибір цілочисельного type також може бути приблизним способом повідомити іншим розробникам про очікуваний діапазон значень. Тип int широко використовується як типовий, коли про конкретне застосування не відомо нічого особливого. long або ulong широко використовують як простий ідентифікатор. Розмір типу в байтах визначає діапазон значень.
Розглянуті досі типи є примітивними. Із кожним із них повʼязано псевдонім struct, який реалізує поля (як-от MinValue) і методи (як-от ToString()) цього типу.
| Тип | Структура | Ширина | Мінімум | Максимум |
|---|---|---|---|---|
sbyte |
SByte |
8 bit | -128 | +127 |
short |
Int16 |
16 bit | -32_768 | +32_767 |
int |
Int32 |
32 bit | -2_147_483_648 | +2_147_483_647 |
long |
Int64 |
64 bit | -9_223_372_036_854_775_808 | +9_223_372_036_854_775_807 |
byte |
Byte |
8 bit | 0 | +255 |
ushort |
UInt16 |
16 bit | 0 | +65_535 |
uint |
UInt32 |
32 bit | 0 | +4_294_967_295 |
ulong |
UInt64 |
64 bit | 0 | +18_446_744_073_709_551_615 |
Змінну (або вираз) одного типу зазвичай легко перетворити на інший. Наприклад, у присвоєнні, якщо тип значення, яке присвоюють (rhs), гарантує, що значення вміститься в діапазон типу-приймача (lhs), то достатньо простого присвоєння:
ulong ul;
uint ui = uint.MaxValue;
ul = ui; // no problem
З іншого боку, якщо діапазон типу-джерела не є підмножиною діапазону значень типу-приймача, то знадобиться операція приведення (), навіть якщо конкретне значення входить до діапазону типу-приймача:
uint ui;
short s = 42;
ui = (uint)s;
У наведеному прикладі, якби значення виходило за межі діапазону типу-приймача, сталося б переповнення. Див. overflow.
Потреба в приведенні визначається двома задіяними типами, а не конкретним значенням.
Наступні абзаци розглядають приведення цілочисельних типів. У casting ширше розглянуто приведення й перетворення типів. Про перетворення між цілочисельними типами та числами з плаваючою комою, char і bool читайте в тій самій документації.
Система типів C# дещо строгіша, ніж у C або JavaScript, і тому операції приведення тут більш обмежені. Неявне приведення відбувається між двома числовими типами, доки тип-приймач здатен зберегти масштаб і знак значення типу-джерела.
Неявне приведення не позначається жодним спеціальним синтаксисом.
Там, де числові типи не можна привести неявно, зазвичай можна скористатися оператором явного приведення.
Якщо значення, яке приводять, не можна подати в типі-приймачі, бо він недостатньо широкий, або виникає конфлікт знаків, то може бути викинуто виняток переповнення.
int largeInt = Int32.MaxValue;
int largeNegInt = Int32.MinValue;
ushort shortUnsignedInt = ushort.MaxValue;
// implicit cast
int from_ushort = shortUnsignedInt; // 65535
float from_int = largeInt; // -21474836E+09
// explicit cast
uint from_largeInt = (uint)largeInt; // 2147483647
uint from_neg = (uint) largeNegInt; // 2147483648 or OverflowException is thrown (if checked)
Клас BitConverter дає зручний спосіб перетворювати цілочисельні типи на масиви байтів і назад.