Як комп’ютер визначає, чи є число меншим чи більшим від іншого?


34

Це може здатися дурним питанням, але мені дуже цікаво знати, як комп'ютер знає, що це ? Крім того, як комп'ютер знає, що порядок цілого числа та алфавіту A, B, C, D, ...? Це десь зберігається в апаратному забезпеченні чи операційна система надає подібну інформацію?1<21,2,3,4,5,


1
Для того, щоб відповісти на це запитання задовільно, нам слід було б знати, скільки Ricky Stam знає про архітектуру комп’ютера. З питання це виглядає дуже мало, тому жодна з фантазійних відповідей нижче не буде зрозумілою для нього.
Андрій Бауер

@AndrejBauer: Насправді він не ввійшов у систему з часу запитання. Можливо, він зараз знає все, що йому потрібно.
Дейв Кларк

Відповіді:


31

Спочатку ваші цілі числа перетворюються на двійкові числа. Наприклад, ціле число 2 перетворюється в 0010.

Процесор використовує цифровий компаратор :

Цифровий компаратор або величина компаратор являє собою електронний пристрій , апаратне забезпечення , яке приймає два числа в якості вхідних даних в двійковій формі і визначає , є чи одне число більше або менше або дорівнює інший номер.

Компаратори застосовуються в центральних процесорних блоках (ЦП) та мікроконтролерах.

Джерело: https://en.wikipedia.org/wiki/Digital_comparator

У апараті компаратора використовуються деякі ворота (AND, OR, NAND, NOR, XOR тощо). Ці ворота приймають двійкові входи і дають результат у двійковій формі. Висновок можна побачити з таблиці правдивості.

Inputs           Outputs
A   B     A>B    A=B    A<B
0   0     0       1      0
0   1     0       0      1
1   0     1       0      0
1   1     0       1      0

Ось 0і 1електронні напруги для воріт.
1- Представляє деяку порогову напругу, яка вказує на деяку позитивну напругу.
0- Представляє напругу нижче порогової.

Скажімо, наприклад, компаратор працює на 5 вольт (це враховує пояснення), тоді:
Напруга більше 3 вольт може вважатися такою binary-1.
Напруга нижче 3 вольт вважати такоюbinary-0

Якщо затвор отримує один вхід як 3,5 вольт, а інший - 2 вольт, то він вважає, що він приймає один вхід як двійковий 1, а інший - як двійковий 0.

Ці послідовності 1 і 0 забезпечуються дуже швидко через комутаційну схему.

Функціонування дворозрядного цифрового компаратора можна виразити у вигляді таблиці правдивості:

 Inputs                            Outputs
   A1   A0  B1  B0  A>B    A=B   A<B        
    0   0   0   0    0      1     0
    0   0   0   1    1      0     0
    0   0   1   0    1      0     0
    0   0   1   1    1      0     0
    0   1   0   0    0      0     1
    0   1   0   1    0      1     0
    0   1   1   0    1      0     0
    0   1   1   1    1      0     0
    1   0   0   0    0      0     1
    1   0   0   1    0      0     1
    1   0   1   0    0      1     0
    1   0   1   1    1      0     0
    1   1   0   0    0      0     1
    1   1   0   1    0      0     1
    1   1   1   0    0      0     1
    1   1   1   1    0      1     0

Цитувати з Вікіпедії :

Приклади: Розгляньте два 4-розрядних двійкових чисел A і B таким чином, що
введіть тут опис зображення
введіть тут опис зображення
Тут кожен індекс має одну з цифр у числах.

Рівність

Двійкові числа A і B будуть рівні, якщо всі пари значущих цифр обох чисел рівні, тобто
введіть тут опис зображення. введіть тут опис зображення. введіть тут опис зображення. введіть тут опис зображення

Оскільки числа є двійковими, цифри дорівнюють 0 або 1 і булева функція для рівності будь-яких двох цифр введіть тут опис зображенняі> введіть тут опис зображенняможе бути виражена як
введіть тут опис зображення

введіть тут опис зображення дорівнює 1, тільки якщо введіть тут опис зображенняі введіть тут опис зображення рівні.

Для рівності A і B всі введіть тут опис зображеннязмінні (для i = 0,1,2,3) повинні бути 1. Отже, умова якості A і B можна реалізувати, використовуючи операцію AND як
введіть тут опис зображення
двійкову змінну (A = B) дорівнює 1, лише якщо всі пари цифр двох чисел рівні.

Нерівність

Для того, щоб вручну визначити більше двох двійкових чисел, ми перевіряємо відносні величини пар значущих цифр, починаючи з найзначнішого розряду, поступово переходячи до менших значущих бітів, поки не буде знайдена нерівність. Якщо знайдено нерівність, якщо відповідний біт A дорівнює 1, а B - 0, то робимо висновок, що A> B. Це послідовне порівняння може бути логічно виражене як:

введіть тут опис зображення


2
Ой, що тут відбувається?
Жил "ТАК - перестань бути злим"

1
"Спочатку ваші цілі числа перетворюються на двійкові числа" ... неправильно, в пам'яті на першому місці є лише двійкові числа, усі його "1" і "0" на машинному рівні, тому "конвертації" немає, 2 є представлений як 10 від початку до кінця ..
Dr.Haimovitz

Копіюючи матеріали з інших джерел, ви повинні забезпечити належну атрибуцію своїх джерел. Дивіться тут і тут .
DW

Двобітова таблиця цифрового компаратора неправильна. ijesi.org/papers/Vol(2)1%20(version%202)/C211324.pdf, коли A1, A0 обидва дорівнюють нулю, але B0 і B1 - 0, 1 A> B буде 0, наприклад.
користувач1455116

14

Це не просто "знає", але перевіряє кожен раз. В основному, він робить те саме, що ви робили: для порівняння він перевіряє (зліва), яке число має першу цифру, що більше, ніж відповідна в іншому номері. Звичайно, ви повинні додати провідні нулі до коротшого числа.

Букви - це просто цифри для комп'ютера. Люди присвоїли літерам цифри, наприклад, ASCII або Unicode , щоб порівняння чисел також дало "правильний" порядок для літер.


Також це зазвичай називають " лексикографічним порядком ". Зазвичай ми можемо вважати це спочатку впорядкуванням по довжині (найкоротше до найдовшого), потім за алфавітом.
usul

@usul Це нагадує мені, що деталі порівняння цілих чисел, очевидно, залежать від конкретного кодування; те, що я описую, працює для "наївних" двійкових чисел, що може бути далеко не тим, що використовує власне процесор.
Рафаель

Так, абсолютно. Я недавно занадто багато думав про машини Тюрінга :). Справжні машини не зовсім відповідають тому, про що ми говорили тут весь час ....
usul

9

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

Щодо алфавіту, в буквено-цифрових та інших спеціальних символах ASCII представлені як цілі числа, тому їх порівняння також є цілою операцією порівняння, яку виконує ЦП.


4

Власне, і для того, щоб отримати повне уявлення про це, я думаю, було б дуже корисно побачити на власні очі прокладку даних фактичного процесора, наприклад MIPS: введіть тут опис зображення

Як ви бачите, насправді є другий вихід з АЛУ, який є сигналом під назвою Нуль. Він існує для того, щоб виконувати операції з швидкою гілкою, після визначення того, чи є два операнди порівняння рівними нулю чи ні , оскільки більшість порівнянь у межах програми стосуються гілок. Тому, коли ви створюєте можливість філії у своєму коді, наприклад:

if (a <b) {...}

  

Зауважте, що нульовий сигнал є одним з входів воріт AND, який визначає, звідки лічильник програми (ПК) прийме своє значення від: Припустимо, що сигнал гілки "1", оскільки ми маємо операцію відділення

Сподіваюся, я допоміг вам побачити "під капотом". Не соромтеся просити додатковий аналіз з цього питання. Багато речей, які ми приймаємо як належне, процесори роблять їх дуже захоплююче!


Етане, як працює "менша" операція на цьому шляху? Як я розумію, ви описали операцію "не рівну". Що означає інструкція "slt"?
osgx

2

Якщо ви хочете знати про те, як це робить власне процесор, це щось подібне.

Центральний процесор працює на номерах лише до певного розміру. Зараз це зазвичай 64-бітні цілі числа (ми будемо ігнорувати числа з плаваючою комою; ідея буде аналогічною).

Тому ми повинні це визнати

  1. Центральний процесор зберігає номери до (скажімо) 64 біт у двійковій формі, в якомусь форматі (можливо, 2s-доповнення, але не має великого значення, що).

  2. Центральний процесор не може нічого робити з числами, що перевищують це. Ми повинні писати програмні алгоритми, якщо ми хочемо порівняти великі числа.

аб

а-ба-бменше нуля. Це робиться за допомогою єдиної нативної операції, яка могла б працювати на рівні схеми, як алгоритми порівняння, описані в інших відповідях. Це буде виглядати дуже схоже на ці, але всі реалізовані в мікросхемах (оскільки кількість становить максимум 64 біт, це схема певного розміру, яку ми можемо встановити на комп'ютері та вставити на процесор.) Залежно від того, як процесор зберігає номери, це може бути навіть швидше, оскільки може бути, що всі негативні числа мають перший біт, встановлений на один, або щось подібне. Так чи інакше, всього 64 біта, тож ми точно можемо перевірити, чи є це число від’ємним.

а<баб

Тепер, для більшої кількості, ми повинні реалізувати щось у програмному забезпеченні, яке використовуватиме ці невеликі порівняння як підпрограми.


1

Щоб відповісти на це запитання, спершу зазначу, що для порівняльних чисел на комп’ютері, машинному та програмному рівні існує як мінімум два рівні абстракції .

Порівняння чисел на рівні машини

У сучасному комп’ютері процесор має багатий набір інструкцій. Ці інструкції включають, наприклад, завантаження комірки пам’яті в регістр, збільшуючи регістр, додаючи два регістри та багато інших. Також мають бути інструкції щодо умовних стрибків . Наприклад, процесори в сім'ї x86 Intel підтримують вказівки jnz(стрибок, якщо не нуль), jne(стрибок не рівний) тощо. Якщо їх не буде, процесор не буде завершеним Тьюрінгом. Змінні, від яких залежить умовний стрибок, зберігаються в регістрах. Таким чином, ці інструкції є жорсткими в архітектурі ЦП як побудова ланцюга з логічних воріт. Це єдиний спосіб, як процесор може порівняти два числа.

Порівняння чисел на програмному рівні

Якщо порівнювати два числа, скажімо, в програмі c ++, то це переводиться в машинний код і тому здійснюється на машинному рівні. Однак таке порівняння може бути складнішим. Це дійсно залежить від типу даних, який ви використовували, як порівняння переводиться в машинний код. Тільки один приклад: цифри, які ви хочете порівняти, походять з 64 бітових слів, але ваша машина працює лише з 32 бітами. Тоді це число не вписується в реєстр, отже, компілятор розбиває порівняння на послідовність порівнянь на рівні машинного коду. Це ж стосується і більш складних типів даних / структур даних, що представляють, наприклад, раціональні числа, рядки або символи. Отже, коли вам доведеться порівнювати два символи, це переводиться програмним забезпеченням (операційна система, компілятор, інтерпретатор, ...) у машинний код.

В якості остаточного зауваження хочу зазначити, що стандартні процесори також можуть працювати з різними представленнями чисел (підписані цілі числа в представленні 1- або 2-доповнення, плаває). Також можна порівняти в інших частинах комп'ютера, таких як GPU.


0

інші відповіді хороші, просто викинувши ще одну туди для подальшого розгляду / розуміння з ароматом CS / поворотом. можна побудувати FSM , машину з кінцевим станом, яка може порівнювати два двійкові числа будь-якої довжини, починаючи попарно від найбільш значущих бітів і працюючи до найменш значущого біта (LSB). він також може бути використаний для концептуалізації цифрового компаратора, наведеного в іншій відповіді, проте FSM не вимагає двійкових чисел кінцевої довжини. він навіть може працювати над цілими числами з двійковими дробами після LSB. він має індуктивний та рекурсивний смак і може бути доведений правильним шляхом простої індукції. він працює наступним чином:

  • введіть дві найбільші двійкові цифри у вигляді пари (a, b)
  • якщо a = 1 і b = 0, ліве число більше.
  • якщо a = 0 і b = 1, правильне число більше.
  • інакше цифри "рівні до теперішнього часу", перейдіть до наступної пари.

інакше кажучи, найбільша кількість - це перша, коли перший біт - один, а другий - нуль, після початкового прогону нуля або більше однакових 1. цифровий компаратор кінцевої довжини з воріт або 1-бітових компараторів можна розглядати як основу на фіксації тривалості цієї операції FSM до деякої фіксованої кількості біт. (так, існує сильна відповідність між усіма кінцевими схемами та "фіксація довжини" обчислень FSM.)

це може здатися теоретичним вправою, але насправді логіка в програмному забезпеченні для представлення довільних точних чисел оперує чимось аналогічним цьому FSM, за винятком закодованого в комп'ютерному циклі, який можна розглядати як перекидання або імітацію кроків FSM (ефективна реалізація може відстежувати за допомогою індексу місце MSB).


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

а×10баб

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.