Знаковий біт

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Знаковий біт двійкового числа

В комп’ютерних науках знаковий біт або знаковий розряд (англ. sign bit) це біт, що позначає знак числа[1]. Знаковий біт мають лише числові типи зі знаком, він незмінно розташований у позиції найстаршого біта, у певних контекстах термін «знаковий біт» вживають у сенсі «найстарший біт». Зазвичай, якщо знаковий біт дорівнює 0, число невід’ємне (додатне або нуль), а якщо знаковий біт 1, тоді число від’ємне[1]. Такої нотації знаку числа дотримуються найбільш поширені в обчислювальній техніці прямий (англ. sign-and-magnitude), обернений (англ. one's complement) та доповняльний (англ. two's complement) коди чисел.

У схемах обробки чисел з рухомою комою, на відміну від схем з фіксованою комою, під час представлення чисел потрібні два знакові розряди: один — для представлення знака мантиси, інший — для представлення знака порядку. Якщо використовується модифікований зворотний і доповнювальний код знак числа також зображається як дворозрядний код «00», у разі невід'ємних чисел, і як код «11» — у разі від'ємних чисел. Це дає можливість легко визначати ситуацію, за якої відбулося переповнення розрядної сітки машини (ознакою переповнення є наявність коду «01» або коду «10» у знаковому розряді).

Під час виконання операцій додавання (віднімання) знак результату виходить автоматично, оскільки в операції беруть участь не самі числа, а їх коди (включаючи код знаку). Під час виконання операцій множення (ділення) знак результату визначається сумуванням кодів знакового розряду множеного і множника (діленого та дільника) по mod 2.[уточнити]

Діапазон представлення чисел зі знаком[ред. | ред. код]

Оскільки старший розряд числа відповідає за знак, лише n-1 розрядів можуть бути використані як цифрові розряди числа[2]. Таким чином, однобайтові числа зі знаком мають лише 7 цифрових бітів, двобайтові числа мають, відповідно 15 цифрових бітів і т. д. У прямому та оберненому кодах діапазон представлення чисел розташовується симетрично відносно нуля, тобто кількість від'ємних чисел дорівнює кількості додатних чисел. Для прикладу, однобайтовий прямий та обернений коди можуть представити числа в діапазоні -127...+127. У цих кодах має місце так званий «нуль зі знаком», тобто різні представлення для чисел «плюс нуль» і «мінус нуль», останній з яких не відповідає математичній концепції від’ємного числа. В доповняльному коді нуль має лише один код, тому діапазон представлення чисел несиметричний відносно нуля. Так, однобайтовий доповняльний код представляє числа в діапазоні –128...+127.

Зміна знаку числа в різних кодах[ред. | ред. код]

У прямому коді знаковий біт позначає знак числа, а цифрові біти містять двійкові цифри числа. Для зміни знаку числа у прямому коді достатньо змінити лише знаковий біт.

+58 = 00111010 
–58 = 10111010

В оберненому коді знаковий біт позначає знак числа, а цифрові біти містять цифри числа для додатних чисел та інверсію цифр для від'ємних чисел. Для зміни знаку числа потрібно інвертувати всі біти числа.

+58 = 00111010
–58 = 11000101

У доповняльному коді знаковий біт позначає знак числа, цифрові біти додатного числа містять цифри числа, а від'ємного числа – доповнення до 2n, де n – кількість цифр. На практиці для одержання доповняльного коду числа додають 1 до оберненого коду. Для зміни знаку числа в доповняльному коді потрібно інвертувати всі біти числа і додати одиницю.

+58 = 00111010
      11000101
            +1
–58 = 11000110

Числа з рухомою комою, такі як формат IEEE, формат IBM[en], формат VAX і, навіть, формат, використаний в машинах Цузе Z1 і Z3, використовують представлення чисел у прямому коді. Для зміни знаку числа достатньо змінити знаковий біт.

Розширення знаку[ред. | ред. код]

Якщо необхідно привести число у доповняльному коді до більш широкого формату, не змінюючи його числового значення (наприклад, з одного байту до двох байтів), то додаткові старші біти повинні бути заповнені копією знакового біту, цей процес називається розширенням знаку[en][3] або розмноженням знаку. Наприклад, однобайтове додатне двійкове число 00111010, розширене до двох байтів, записується в доповняльному коді як 00000000.00111010, а від’ємне число 11000110 як 11111111.11000110.

Процесори сімейства x86 мають спеціальні команди розширення знаку CBW (Convert Byte to Word), CWD та CWDE (Convert Word to Doubleword), CDQ (Convert Doubleword to Quadword)) та універсальну команду MOVSX (Move with Sign-Extension), призначені для автоматичного збільшення формату числа.

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

Примітки[ред. | ред. код]

  1. а б Ковалюк Т.В. Основи програмування. – 2005.
  2. David Tarnoff. Computer Organization and Design Fundamentals. – 2011.
  3. Рудольф Марек. Ассемблер на примерах. – 2005. – C. 46.

Джерела[ред. | ред. код]