Про значення типів даних
Типи даних мають особливе значення в С#, оскільки це строго типізована мова. Це означає, що всі операції піддаються суворому контролю компілятора на відповідність типів, причому неприпустимі операції не компілюються. Отже, суворий контроль типів дозволяє виключити помилки та підвищити ефективність програм. Для забезпечення контролю типів усі змінні, вирази та значення повинні належати до певного типу. Такого поняття, як "безтипова" змінна, у цій мові програмування взагалі немає. Більше того, тип значення визначає ті операції, які дозволяється виконувати над ним. Операція, дозволена одному типу даних, може бути неприпустимою іншого.

68 Частина I. Мова C#
У версії C# 4.0 впроваджено новий тип даних, званий dynamic і спричиняє відстрочку контролю типів до часу виконання, замість виробляти подібний контроль під час компіляції. Тому тип dynamic є винятком із звичайного
Типи значень C#
В основу мови C# покладено 13 типів значень, перерахованих у табл. 3.1. Усі вони називаються простими типами, оскільки складаються із єдиного значення. (Іншими словами, вони не складаються з двох або більше значень.) Вони становлять основу системи типів С#, надаючи найпростіші, низькорівневі елементи даних, якими можна оперувати у програмі. Прості типи даних іноді ще називають примітивними.
Таблиця. 3.1. Типи значень C#
Логічний, надає два значення: "істина" або "брехня"
цілісний без знака
Десятковий (для фінансових розрахунків)
З плаваючою точкою подвійної точності
З плаваючою точкою одинарної точності
цілий зі знаком
Цілочисленний без знака
Довгий цілісний без знаку
Короткий цілий без знака
У C# суворо визначено межі та характер дії кожного типу значення. З вимог до переносимості програм, C# не допускає у цьому відношенні жодних компромісів. Наприклад, тип int має бути однаковим у всіх середовищах виконання. Але в цьому випадку відпадає необхідність переписувати код для кон

Глава 3. Типи даних, літерали та змінні 69
конкретні платформи. І хоча суворе визначення розмірності типів значень може спричинити незначне падіння продуктивності у деяких середовищах, цей захід необхідний досягнення переносимості програм.
Цілочисленні типи
У C# визначено дев'ять цілих типів: char, byte, sbyte, short, ushort, int, uint, long і ulong. Але тип char застосовується, головним чином, для подання символів і тому розглядається далі в цьому розділі. Інші вісім цілих типів призначені для числових розрахунків. Нижче представлені їх діапазон уявлення чисел і розрядність у бітах.
Розрядність у бітах
Діапазон представлення чисел
147 483 147 483 647
223 372 036 854 775 223 372 036 854 775 807
446 744 073 709 551 615
Як випливає з наведеної вище таблиці, в C# визначено обидва варіанти різних цілих типів: зі знаком і без знака. Цілочисленні типи зі знаком відрізняються від аналогічних типів без знака методом інтерпретації старшого розряду цілого числа. Так, якщо в програмі вказано ціле значення зі знаком, то компілятор C# згенерує код, в якому старший розряд цілого числа використовується як прапор знака. Число вважається позитивним, якщо прапор знака дорівнює 0 інегативним, якщо він дорівнює 1. Негативні числа практично завжди є методом доповнення до двох, відповідно до якого всі двійкові розряди негативного числа спочатку інвертуються, а потім до цього числа додається 1.
Цілочисленні типи зі знаком мають велике значення для багатьох алго ритмов, але з абсолютної величині вони наполовину менше своїх аналогів без знака. Ось як, наприклад, виглядає число 32767 типу short в двійковому поданні.
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Якщо встановити старший розряд цього числа рівним 1, щоб отримати значення зі знаком, воно буде інтерпретовано як враховуючи формат до двох до двох. Але якщо оголосити його як значення типу ushort, то після встановлення в 1 старшого розряду воно стане рівним 65535.
70 Частина I. Мова C#
Ймовірно, найпоширенішим у програмуванні цілим типом є тип int . Змінні типу int нерідко використовуються для управління циклами, індексування масивів та математичних розрахунків загального призначення. Коли ж потрібно ціле значення з великим діапазоном уявлення чисел, ніж у типу int , то для цієї мети є цілий ряд інших цілих типів. Так, якщо значення потрібно зберегти без знака, то для нього можна вибрати тип uint для великих значень зі знаком - тип long, а для великих значень без знака - тип ulong. Як приклад нижче наведено програму, що обчислює відстань від Землі до Сонця в дюймах. Для зберігання настільки великого значення в ній використовується змінна типу long.
// Обчислити відстань Землі до Сонця в дюймах.
miles = 93000000; // 93 000 000 миль до Сонця
// 5280 футів в милі, 12 дюймів у футі, inches = miles * 5280 * 12;
Console.WriteLine("Відстань до Сонця: "+ inches + "дюймів.");
Ось як виглядає результат виконання цієї програми.
Відстань до Сонця: 5892480000000 дюймів.
Очевидно, що цей результат не можна було б зберегти в змінній типу int
Найдрібнішими цілими типами є byte і sbyte. Тип byte представляє цілі значення без знака в межах від 0 до 255. Змінні типу byte особливо зручні для обробки вихідних двійкових даних, наприклад байтового струму, що надходить від деякого пристрою. А для подання дрібних цілих значень зі знаком служить тип sbyte. Нижче наведено приклад програми, у якій змінна типу byte використовується управління циклом, де підсумовуються числа від 1 до 100.