Ціле число (тип даних)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Ціле число (англ. 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). Наприклад, для оголошення беззнакового цілого, рівного за розміром одному машинному слову використовується тип 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 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 відповідно.

Див. також[ред.ред. код]

Посилання[ред.ред. код]

  1. Cheever, Eric. Representation of numbers. Swarthmore College. Процитовано 2011-09-11. 
  2. Урок 7. Розширені арифметичні операції з цілими числами, Низькорівневе програмування, СУНЦ НДУ[en]
  3. Types, Values and Variables, Java Languaege Specification, 2-nd ed.
  4. «Чи потрібні беззнакові цілі?» (22 січня 2013)