Ціле число (тип даних)
Ціле число (англ. Integer) — поширений тип даних, що представляє ціле число.
Тип даних «ціле число» використовується в більшості мов програмування. Як правило, мови програмування підтримують різні типи цілих чисел, з різною кількістю двійкових розрядів і діапазоном значень. Наприклад, у мові Паскаль (версія Free Pascal для інтелівських процесорів) це:
- Byte (0 .. 255)
- Shortint (-128 .. 127)
- Smallint (-32768 .. 32767)
- Word (0 .. 65535)
- Longint (-2147483648 .. 2147483647)
- Longword (0 .. 4294967295)
- Int64 (-9223372036854775808 .. 9223372036854775807)
- QWord (0 .. 18446744073709551615)
Як правило, діапазон значень визначається кількістю байтів, що відведена під конкретний цілий тип у пам'яті комп'ютера.
Подання
У пам'яті типової комп'ютерної системи ціле число представлено у вигляді ланцюжка бітів фіксованого (кратного 8) розміру. Ця послідовність нулів і одиниць - не що інше, як двійковий запис числа, оскільки зазвичай для подання чисел у сучасній комп'ютерній техніці використовується позиційний двійковий код. Діапазон цілих чисел, як правило, визначається кількістю байтів в пам'яті комп'ютера, що відводяться під одну змінну.
Багато мов програмування пропонують вибір між короткими (англ. short), довгими (англ. long) і цілими стандартної довжини. Довжина стандартного цілого типу, як правило, збігається з розміром машинного слова на цільовій платформі. Для 16-розрядних операційних систем - цей тип (int) складає 2 байта і збігається з типом short int (можна використовувати як short, опускаючи слово int), для 32-розрядних операційних систем він буде дорівнювати 4 байти та збігатися з довгим цілим long int (можна використовувати як long, опускаючи слово int). Коротке ціле short int, для 16-розрядних операційних систем, 32-розрядних операційних систем, і для більшості 64-розрядних операційних систем складає - 2 байти. Також в деяких мовах може використовуватися тип даних подвійне довге long long, який складає 8 байт.
Для 64-розрядних операційних систем враховуючи різницю моделей даних (LP64, LLP64, ILP64), уявлення цілого типу на різних моделях даних може відрізнятися між собою. Тип int і long може складати як 4, так і 8 байт.
Варто відзначити, що кожна мова програмування реалізує свою сигнатуру представлення цілих чисел, яка може відрізняться від міжнародних стандартів, але зобов'язана їх підтримувати. Наприклад можна віднести крос-платформену бібліотеку Qt, де ціле представляється типом qintX і quintX, де X - 8,16,32,64.
Цілі типи поділяються на беззнакові (англ. unsigned) і знакові (англ. signed)[1].
Беззнакові цілі
Беззнакові цілі представляють тільки невід'ємні числа, при цьому всі розряди коду використовуються для подання значення числа і максимальне число відповідає одиничним значенням коду у всіх розрядах: 111 … 111. M-байтова змінна цілого типу без знака, очевидно, приймає значення від 0 до +28m−1.
У C і C++ для позначення беззнакових типів використовується модифікатор unsigned. У C# для цього використовується префікс u
(від англ. unsigned). Наприклад, для оголошення беззнакового цілого, рівного за розміром одному машинному слову в мовах C/C++ використовується тип unsigned int
, в C# — uint
.
Беззнакові цілі, зокрема, використовуються для адресації пам'яті, представлення символів.
Іноді в літературі зустрічаються рекомендації не використовувати тип беззнакові цілі, оскільки він може бути не реалізований процесором комп'ютера, однак навряд чи цю пораду можна вважати актуальною — більшість сучасних процесорів (у тому числі x86-сумісні[2]) однаково добре працюють як зі знаковими, так і з беззнаковими цілими.
У деяких мовах, наприклад java, беззнакові цілі типи (за винятком символьного) відсутні[3].
Неправильне використання беззнакових цілих може призводити до неочевидних помилок через виникаюче переповнення[4]. У наведеному нижче прикладі використання беззнакових цілих у циклі в C і C++ перетворює цей цикл у нескінченний:
char ar[N];
for (unsigned int i = N-1; i >= 0; --i)
ar[i] = i;
Цілі зі знаком
Існує кілька різних способів представлення цілих значень в двійковому коді у виді величини зі знаком. Зокрема можна назвати прямий і зворотний коди. Знак кодується в старшому розряді числа: 0 відповідає позитивним, а 1 негативним числам.
Можуть бути використані і більш екзотичні представлення негативних чисел, такі, як, наприклад, система числення за основою -2.
Однак для більшості сучасних процесорів звичайним представленням чисел зі знаком є додатковий код. Максимальне позитивне число представляється двійковим кодом 0111 ... 111, максимальне по модулю негативне кодом 1000 ... 000, а код 111 ... 111 відповідає -1. Таке представлення чисел відповідає найбільш простій реалізації арифметичних логічних пристроїв процесора на логічних вентилях і дозволяє використовувати один і той самий алгоритм додавання і віднімання як для беззнакових чисел, так і для чисел зі знаком (відмінність - тільки в умовах, при яких вважається, що настало арифметичне переповнення).
М-байтова змінна цілого типу зі знаком приймає значення від −28m-1 до +28m-1−1.
Граничні значення для різних бітностей
Нижче представлена таблиця граничних значень десяткових чисел для різних бітностей при кодуванні додатковим кодом. У колонці «Максимальне десяткове» спочатку йде максимальне значення цілого без знаку, а під ним мінімальне і максимальне ціле зі знаком.
Біт | Байт | Дв. слів | Максимальне десяткове | Дес. цифр |
---|---|---|---|---|
4 | ½ | ⅛ | 15 -8 +7 |
2 1 1 |
8 | 1 | ¼ | 255 -128 +127 |
3 3 3 |
16 | 2 | ½ | 65.535 -32.768 +32.767 |
5 5 5 |
24 | 3 | ¾ | 16.777.215 -8.388.608 +8.388.607 |
8 7 7 |
32 | 4 | 1 | 4.294.967.295 -2.147.483.648 +2.147.483.647 |
10 10 10 |
48 | 6 | 1½ | 281.474.976.710.655 -140.737.488.355.328 +140.737.488.355.327 |
15 15 15 |
64 | 8 | 2 | 18.446.744.073.709.551.615 -9.223.372.036.854.775.808 +9.223.372.036.854.775.807 |
20 19 19 |
96 | 12 | 3 | 79.228.162.514.264.337.593.543.950.335 -39.614.081.257.132.168.796.771.975.168 +39.614.081.257.132.168.796.771.975.167 |
29 29 29 |
128 | 16 | 4 | 340.282.366.920.938.463.463.374.607.431.768.211.455 -170.141.183.460.469.231.731.687.303.715.884.105.728 +170.141.183.460.469.231.731.687.303.715.884.105.727 |
39 39 39 |
256 | 32 | 8 | 115.792.089.237.316.195.(...).584.007.913.129.639.935 -57.896.044.618.658.097.(...).792.003.956.564.819.968 +57.896.044.618.658.097.(...).792.003.956.564.819.967 |
78 77 77 |
512 | 64 | 16 | 13.407.807.929.942.597.099.(...).946.433.649.006.084.095 -6.703.903.964.971.298.549.(...).973.216.824.503.042.048 +6.703.903.964.971.298.549.(...).973.216.824.503.042.047 |
155 154 154 |
1.024 | 128 | 32 | 179.769.313.486.231.590.(...).356.329.624.224.137.215 -89.884.656.743.115.795.(...).678.164.812.112.068.608 +89.884.656.743.115.795.(...).678.164.812.112.068.607 |
309 308 308 |
2.048 | 256 | 64 | 32.317.006.071.311.007.(...).853.611.059.596.230.655 -16.158.503.035.655.503.(...).926.805.529.798.115.328 +16.158.503.035.655.503.(...).926.805.529.798.115.327 |
617 617 617 |
4.096 | 512 | 128 | 1.044.388.881.413.152.506.(...).708.340.403.154.190.335 -522.194.440.706.576.253.(...).354.170.201.577.095.168 +522.194.440.706.576.253.(...).354.170.201.577.095.167 |
1.234 1.233 1.233 |
8.192 | 1.024 | 256 | 1.090.748.135.619.415.929.(...).505.665.475.715.792.895 -545.374.067.809.707.964.(...).252.832.737.857.896.448 +545.374.067.809.707.964.(...).252.832.737.857.896.447 |
2.467 2.466 2.466 |
16.384 | 2.048 | 512 | 1.189.731.495.357.231.765.(...).027.290.669.964.066.815 -594.865.747.678.615.882.(...).513.645.334.982.033.408 +594.865.747.678.615.882.(...).513.645.334.982.033.407 |
4.933 4.932 4.932 |
32.768 | 4.096 | 1.024 | 1.415.461.031.044.954.789.(...).668.104.633.712.377.855 -707.730.515.522.477.394.(...).334.052.316.856.188.928 +707.730.515.522.477.394.(...).334.052.316.856.188.927 |
9.865 9.864 9.864 |
65.536 | 8.192 | 2.048 | 2.003.529.930.406.846.464.(...).587.895.905.719.156.735 -1.001.764.965.203.423.232.(...).793.947.952.859.578.368 +1.001.764.965.203.423.232.(...).793.947.952.859.578.367 |
19.729 19.729 19.729 |
131.072 | 16.384 | 4.096 | 4.014.132.182.036.063.039.(...).812.318.570.934.173.695 -2.007.066.091.018.031.519.(...).906.159.285.467.086.848 +2.007.066.091.018.031.519.(...).906.159.285.467.086.847 |
39.457 39.457 39.457 |
262.144 | 32.768 | 8.192 | 16.113.257.174.857.604.736(...).605.349.934.298.300.415 -8.056.628.587.428.802.368.(...).302.674.967.149.150.208 +8.056.628.587.428.802.368.(...).302.674.967.149.150.207 |
78.914 78.913 78.913 |
524.288 | 65.536 | 16.384 | 259.637.056.783.100.077.(...).364.528.226.185.773.055 -129.818.528.391.550.038.(...).182.264.113.092.886.528 +129.818.528.391.550.038.(...).182.264.113.092.886.527 |
157.827 157.827 157.827 |
1.048.576 | 131.071 | 32.767 | 67.411.401.254.990.734.(...).119.068.940.335.579.135 -33.705.700.627.495.367.(...).559.534.470.167.789.568 +33.705.700.627.495.367.(...).559.534.470.167.789.567 |
315.653 315.653 315.653 |
Операції над цілими
Арифметичні операції
До цілочислових значень застосовні в першу чергу арифметичні операції. Нижче наведені часто використовувані (у дужках вказані їх позначення в різних мовах програмування і у їм аналогічних засобах).
- Порівняння (англ. comparision). Тут застосовні співвідношення «дорівнює» («=»; «==»; «eq»), «не дорівнює» («! =»; «<>»; «Ne»), «більше» («>»; « gt »),«більше або дорівнює»(«> = »;« ge »),«менше»(« <»;« lt ») і «менше або дорівнює»(« <= »;« le »).
- Інкремент (англ. increment; «++») і декремент (англ. decrement; «--») - арифметичне збільшення або зменшення числа на одиницю. Виділено в окремі операції через часте використання зі змінними-лічильниками в програмуванні.
- Додавання(англ. addition; «+») і віднімання (англ. substraction; «-»).
- Множення (англ. multiplication; "*").
- Ділення (англ. division; «/»; «\») і отримання залишку від ділення (англ. modulo; «%»). Деякі процесори (наприклад, архітектури x86) дозволяють здійснювати обидві ці операції за одну інструкцію.
- Інверсія знака (англ. negation) і отримання абсолютного значення (англ. absolute).
- Отримання знака. Результатом такої операції зазвичай є 1 для позитивних значень, -1 - для негативних і 0 - для нуля.
- Піднесення до степеня («^»).
У деяких мовах програмування для лаконічності існують оператори, які дозволяють здійснювати арифметичну операцію з присвоєнням. Наприклад, «+=» додає поточне значення змінної ліворуч до виразу праворуч і поміщає результат у вихідну змінну. Так само в деяких мовах і середовищах доступна поєднана операція MulDiv, яка помножує на одне число, а потім ділить результат на друге.
Зазвичай найдорожчими за швидкістю операціями є множення і ділення (одержання залишку від ділення).
У пам'яті комп'ютера для зберігання цілих чисел зазвичай відводяться комірки фіксованого розміру. Через це операції збільшення та зменшення значень можуть призводити до переповнення, що обертається спотворенням результату. Деякі мови програмування дозволяють здійснювати виклик виключення в таких випадках. Крім цього можна визначати поведінку при переповненні:
- Циклічна операція (зазвичай відбувається за умовчанням). Наприклад, якщо зробити інкремент 8-бітного беззнакового значення 255, то вийде 0.
- Операція з насиченням. Якщо буде досягнута межа, то кінцевим значенням буде граничне. Наприклад, якщо до 8-бітного беззнакового числа 250 додати 10, то вийде 255. Додавання, віднімання та множення з насиченням зазвичай застосовується при роботі з кольором.
Побітові операції
Крім математичних, до цілих чисел застосовні бітові операції, які засновані на особливостях позиційного двійкового кодування. Зазвичай вони виконуються значно швидше, ніж арифметичні операції і тому їх використовують як більш оптимальні аналоги.
- Бітове зрушення вліво з доповненням нулями аналогічний множенню числа на ступінь двійки (кількість біт зрушення відповідає ступеню двійки).
- Бітове зрушення вправо аналогічний поділу на ступінь двійки (кількість біт зрушення відповідає ступеню двійки). Деякі мови програмування і процесори підтримують арифметичний зсув, який дозволяє зберігати знак у цілих зі знаком (зберігається значення старшого біта).
- У цілих зі знаком знак можна дізнатися за допомогою старшого біту (у негативних він встановлений).
- Читання і встановлення молодшого біта дозволяє управляти парністю (у непарних чисел він встановлений).
- Побітове «І» над певною кількістю молодших біт дозволяє дізнатися залишок від ділення на ступінь двійки (ступінь відповідає кількості біт).
- Побітове «АБО» над певною кількістю молодших біт і подальший інкремент округлює число на значення, рівне ступеню двійки (ступінь відповідає кількості біт) - використовується для вирівнювання адрес і розмірів на певне значення.
Робота з рядками
Досить частими операціями є отримання рядка з числового значення у внутрішньому поданні і навпаки - число з рядка. При перетворенні в рядок зазвичай доступні засоби задання форматування залежно від мови користувача.
Нижче перераховані деякі з представлень чисел рядком.
- Десяткове число (англ. decimal). При отриманні рядка зазвичай можна задати роздільники розрядів, кількість знаків (додаються лідируючі нулі якщо їх менше) і обов'язкове значення знака числа.
- Число у системі числення, яке є степенем двійки. Найчастіші: двійкова (binary англ. Binary), вісімкова (англ. octal) і шістнадцяткова система (англ. hexadecimal). При отриманні рядків зазвичай можна задати роздільники груп цифр і мінімальну кількість цифр (проводиться доповнення нулями, якщо їх менше). Так як ці подання найчастіше використовуються в програмуванні, то тут зазвичай доступні відповідні функції. Наприклад, вказівка префікса і постфікса для отримання значення відповідно до синтаксису мови. Для 16-кової актуальне зазначення регістру символів, а також обов'язкове додавання нуля, якщо перша цифра представлена буквою (щоб число не визначалося як строковий ідентифікатор).
- Римське число (англ. roman).
- Словесне представлення (у тому числі сума прописом) - число представлене словами на зазначеній натуральній мові.
Перелічувальний тип
До цілих відноситься також перелічувальний тип. Змінні перелічувального типу приймають кінцевий заздалегідь заданий набір значень. Розмір набору не визначається числом байтів, використовуваних для представлення цілочисельних значень змінних такого типу.
Наприклад, у мові Python логічний тип є підтипом цілого і використовує назви False і True, які при переведенні до цілого отримують значення 0 і 1 відповідно.
Див. також
Посилання
- Cheever, Eric. Representation of numbers. Swarthmore College. Процитовано 11 вересня 2011.
- Урок 7. Розширені арифметичні операції з цілими числами, Низькорівневе програмування, СУНЦ НДУ
- Types, Values and Variables, Java Languaege Specification, 2-nd ed.
- «Чи потрібні беззнакові цілі?» (22 січня 2013)