Skip to main content
LibreTexts - Ukrayinska

3.1: Цілі числа

  • Page ID
    67156
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)

    Цілі числа

    Нагадаємо, що математично ціле число є рахунковим числом (1,2,3,...) разом з 0 і від'ємними числами (−1, −2, −3,.). Математично мислення не існує найбільшого (або найменшого) цілого числа, однак насправді, якщо ми зберігаємо число на комп'ютері (який є кінцевим пристроєм), має бути обмеження на найменші та найбільші цілі числа, які слід зберігати. Практично кажучи, ми обмежимо ціле число деякою кількістю біт і стандартними розмірами є 8, 16, 32, 64 і 128.

    Цілі числа без знаку

    Спочатку ми розглянемо цілі числа без знака і, як правило, вони вважаються невід'ємними цілими числами (0,1,2,3,...). Наприклад, 8-бітові беззнакові цілі числа мають загальну кількість\(2^8 = 256\) невід'ємних чисел, а оскільки найменший дорівнює 0, найбільший дорівнює 255.

    У julia типами даних для цілих чисел без знаку є UInt8, UInt16, UIint32, UInt64 та UInt128. Ми можемо отримати найменше та найбільше значення для них за допомогою функцій typemin та typemax.

    typemin(UInt8)
    0x00
    typemax(UInt8)
    0xff

     

    Додаток XXXX охоплює багато деталей подання цілих чисел у двійкових і виконання основних операцій. Ми розглянемо поверхневий рівень представлення цілих чисел та операцій тут, у цьому розділі, але для тих, хто бажає отримати більше глибини, див. Додаток XXX

    У julia ми можемо використовувати функцію bitstring, щоб дати двійкове представлення цілих чисел і плаваючих точок. Наприклад

    bitstring(UInt8(18))
    "00010010"

    і

    bitstring(UInt8(255)) 
    "11111111"

    Аналогічно, цілі числа без знака з більшою кількістю бітів працюють однаково з найбільшим діапазоном цілих чисел. Наприклад

    bitstring(UInt64(100000))
    "0000000000000000000000000000000000000000000000011000011010100000"

    який є рядком довжиною 64.

    Цілі числа зі знаком

    У julia знаковими цілими числами є Int8, Int16, Iint32, Int64 та Int128. Крім того, існує цілочисельний тип Int, який за замовчуванням відповідає цілому розміру типового цілого розміру на вашому комп'ютері. Це, як правило, Int64.

    Давайте розглянемо докладно про 8-бітних цілих числах зі знаком. Найбільші та найменші значення, які можна зберігати за допомогою Int8, можна знайти за допомогою

    typemin(Int8)
    -128
    typemax(Int8)
    127

    В основному число між 0 і 127 ідентичне між Int8 і UInt8.

    Переповнення та підтікання цілочисельних операцій

    Знову ж таки, на відміну від математичних цілих чисел, будь-яке комп'ютерне ціле число має максимальне і мінімальне значення. Коротше кажучи, якщо операція призводить до числа вище максимуму, то є помилка переповнення і менше мінімальної є помилка підливу.

    Ось простий приклад з 8-бітними цілими числами. Нехай

    x=Int8(95)
    95

    і

    y=Int8(70)
    70

    Сума 95 і 70 дорівнює 165 і вище максимального значення для Int8. Однак, вводячи

    x+y
    -91

    повертає дивний результат. Можливо, ми очікували помилку. Що тільки що сталося? Якщо ви хочете дізнатися, чому виникло значення -91, копатися в подробицях в розділі XXX, але причина, по якій не було помилки переповнення, полягає в тому, що julia не перевіряє автоматично на такі помилки, через те, що в перевірці є накладні витрати, що сповільнить операції.

    Якщо ви хочете перевірити, є набір операцій, які перевірятимуть, отже:

    Base.checked_add(x,y)
    OverflowError: 95 + 70 overflowed for type Int8
    
    Stacktrace:
     [1] throw_overflowerr_binaryop(::Symbol, ::Int8, ::Int8) at ./checked.jl:154
     [2] checked_add(::Int8, ::Int8) at ./checked.jl:166
     [3] top-level scope at In[8]:1
     [4] include_string(::Function, ::Module, ::String, ::String) at ./loading.jl:1091

    Перейдіть до документації Julia на checked_add, який запускає список функцій, які перевірятимуть над та підтікання. Якщо є ймовірність помилок переповнення/підливу, то результати можуть бути неправильними. Майте це на увазі, як в розділі XXXX ми напишемо тести для коду.