Треки
/
C#
C#
/
Салабус
/
Цілочисельні числа
Ці

Цілочисельні числа у C#

7 вправ

Про концепцію Цілочисельні числа

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 дає зручний спосіб перетворювати цілочисельні типи на масиви байтів і назад.

Довідка
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Цілочисельні числа

Практика заблокована

Розблокуйте ще 5 вправ, щоб практикувати концепцію Цілочисельні числа