컴퓨터는 숫자가 다른 숫자보다 작거나 큰지 어떻게 확인합니까?


34

어리석은 질문처럼 들릴지 모르지만 컴퓨터가 어떻게 를 알고 있는지 궁금합니다 . 또한 컴퓨터는 정수의 순서가 이고 알파벳이 A, B, C, D, ... 임을 어떻게 알 수 있습니까? 하드웨어에 저장되어 있거나 운영 체제에서 이러한 종류의 정보를 제공합니까?1 , 2 , 3 , 4 , 5 , 1<21,2,3,4,5,


1
이 질문에 만족스럽게 대답하려면 Ricky Stam이 컴퓨터 아키텍처에 대해 얼마나 알고 있는지 알아야합니다. 질문에서 그것은 매우 작은 것처럼 보이므로 아래의 멋진 답변 중 어느 것도 그를 이해할 수 없습니다.
Andrej Bauer

@AndrejBauer : 실제로, 그는 질문을 한 이후에 로그온하지 않았습니다. 어쩌면 그는 이제 필요한 모든 것을 알고있을 것입니다.
Dave Clarke

답변:


31

먼저 정수는 이진수로 변환됩니다. 예를 들어, 정수 2는 0010으로 변환됩니다.

CPU는 디지털 비교기를 사용합니다 .

디지털 비교기 또는 비교기 크기는 이진 형태로 두 숫자 입력을 취하여 하나 개의 숫자 또는 다른 숫자와 동일보다 큰지 또는 작은 지 결정하는 하드웨어 전자 장치이다.

비교기는 중앙 처리 장치 (CPU) 및 마이크로 컨트롤러에 사용됩니다.

출처 : 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-임계 값보다 낮은 전압을 나타냅니다.

예를 들어 비교기가 5V에서 작동한다고 가정하면 (설명을 위해 고려)
3V를 초과하는 전압은로 간주 할 수 있습니다 binary-1.
3V 미만의 전압은binary-0

게이트가 하나의 입력을 3.5V로, 다른 입력을 2V로 가져 오면 하나의 입력을 2 진 1로, 다른 입력을 2 진 0으로 간주합니다.

이러한 1과 0의 시퀀스는 스위칭 회로를 통해 매우 빠르게 제공됩니다.

2 비트 디지털 비교기의 작동은 진리표로 표현 될 수 있습니다.

 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

Wikipedia 에서 인용하려면 :

예 : 두 개의 4 비트 이진수 A와 B를 고려하여
여기에 이미지 설명을 입력하십시오
여기에 이미지 설명을 입력하십시오
여기에서 각 아래 첨자는 숫자의 숫자 중 하나를 나타냅니다.

평등

두 숫자의 유효 숫자 쌍이 모두 같으면 이진수 A와 B가 같습니다 (예 :)
여기에 이미지 설명을 입력하십시오. 여기에 이미지 설명을 입력하십시오. 여기에 이미지 설명을 입력하십시오. 여기에 이미지 설명을 입력하십시오

숫자는 이진수이므로 숫자는 0 또는 1이고 두 숫자가 같은 부울 함수 여기에 이미지 설명을 입력하십시오이며> 여기에 이미지 설명을 입력하십시오는 다음과 같이 표현할 수 있습니다.
여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오여기에 이미지 설명을 입력하십시오and 여기에 이미지 설명을 입력하십시오 가 동일한 경우에만 1 입니다.

A와 B가 동일한 경우 모든 여기에 이미지 설명을 입력하십시오변수 (i = 0,1,2,3의 경우)는 1이어야합니다. 따라서 AND 연산을
여기에 이미지 설명을 입력하십시오
이진 변수 (A = B) 로 사용하여 A와 B의 품질 조건을 구현할 수 있습니다. 두 숫자의 모든 숫자 쌍이 동일한 경우에만 1입니다.

불평등

두 개의 이진수 중 큰 값을 수동으로 결정하기 위해 최상위 비트부터 시작하여 부등식이 발견 될 때까지 하위 유효 비트를 향해 점차 진행하는 유효 숫자 쌍의 상대 크기를 검사합니다. 부등식이 발견되면 A의 해당 비트가 1이고 B의 비트가 0이면 A> B라고 결론을 내립니다. 이 순차적 비교는 논리적으로 다음과 같이 표현 될 수 있습니다.

여기에 이미지 설명을 입력하십시오


2
우와, 무슨 일이야?
Gilles 'SO- 악마 그만해

1
"먼저 정수는 이진수로 변환됩니다"... 잘못, 처음에는 메모리에 이진 숫자 만 있고, 머신 레벨에는 모두 1과 0이 있으므로 "변환"은 없습니다. 2는 처음부터 끝까지 10으로 표시 ..
Dr.Haimovitz

다른 출처에서 자료를 복사 할 때는 출처에 대한 적절한 귀속을 제공해야합니다. 여기여기를 참조 하십시오 .
DW

2 비트 디지털 비교기 테이블이 올바르지 않습니다. ijesi.org/papers/Vol(2)1%20(version%202)/C211324.pdf A1, A0은 모두 0이지만 B0과 B1은 0이면 1 A> B는 0입니다.
user1455116

14

"알지"않고 매번 확인합니다. 기본적으로, 그것은 당신이하는 것과 같은 일을합니다 : 비교하기 위해, 왼쪽에서 첫 번째 숫자가 다른 숫자의 해당 숫자보다 큰 숫자를 확인합니다 (왼쪽에서). 물론 짧은 숫자에 선행 0을 추가해야합니다.

문자는 컴퓨터의 숫자 일뿐입니다. 사람은 ASCII 또는 Unicode 와 같은 숫자 를 문자에 할당 하여 숫자를 비교할 때 문자의 "정확한"순서를 갖 습니다.


또한 이것은 일반적으로 " 사전 순서 "라고합니다. 우리는 일반적으로 그것을 길이 순 (가장 짧은 것부터 가장 긴 것)으로 알파벳순으로 생각할 수 있습니다.
usul December

@usul 정수 비교의 특징은 분명히 특정 인코딩에 달려 있음을 상기시킵니다. 내가 설명하는 것은 실제 CPU가 사용하는 것과는 거리가 "순진한"이진 숫자에 적용됩니다.
Raphael

그렇습니다. 나는 최근에 Turing Machines에 대해 너무 많이 생각했습니다. :). 실제 기계는 우리가 여기에서 말한 것과 항상 맞지 않습니다 ....
usul

9

정수를 비교하는 것은 운영 체제가 아니며 CPU가 처리합니다. 논리 게이트 레벨에서 만들어졌습니다. 이 슬라이드 를 참조하여 수행 방법을 확인하십시오.

알파벳에 대해서는 ASCII 영숫자 및 기타 특수 문자가 정수로 표시되므로이를 비교하는 것도 정수 비교 연산이며 CPU에 의해 수행됩니다.


4

실제로 전체 이미지를 얻으려면 MIPS와 같은 실제 CPU의 데이터 경로를 직접 보는 것이 도움이 될 것입니다. 여기에 이미지 설명을 입력하십시오

보시다시피 실제로 ALU에는 두 번째 출력이 있는데, 이는 0이라는 신호입니다. 프로그램 내의 대부분의 비교는 분기에 관한 것이므로 비교의 두 피연산자가 0인지 여부 를 결정한 후 빠른 분기 작업을 수행하기 위해 존재합니다 . 따라서 코드에서 분기 가능성을 만들면 다음과 같습니다.

if (a <b) {...}

예를 들어 다음과 같이 기계 코드로 번역됩니다 (예 : blt s0, s1, If a <b 괄호 안에 명령을 실행하는 경우 그렇지 않으면 if {} 외부에서 계속 실행). 즉,이 명령은 두 (단순) MIPS 명령으로 변환되는 의사 명령어 수단이다 SLT에서, S0, S1제로 경우에서 BNE (SLT : 집합 미만 및 BNE : 분기 같지 않음).  

신호 0은 프로그램 카운터 (PC)가 값을 가져 오는 위치를 결정하는 AND 게이트의 입력 중 하나입니다. 분기 연산이 있으므로 분기 신호가 '1'이라고 가정합니다.

  • Zero = 0 빼기 결과가 0이 아니므로 멀티플렉서는 분기 대상에서 주소를 선택하고 분기가 이끄는 명령부터 실행이 계속됩니다.
  • Zero = 1 결과는 0 (a = b)이므로 MUX는 가산기에서 주소를 선택합니다. 여기서 add 명령은 정상적인 실행에서 다음 명령어의 주소를 계산합니다 (직렬). 조건 (a <b)이 유효하지 않으므로 점프가 실행되지 않습니다.

"보닛 아래"를 보도록 도와주세요. 이 문제에 대한 추가 분석을 요청하십시오. 우리가 당연하게 여기는 많은 것들, CPU는 그것들을 매우 매혹적인 방식으로 수행합니다!


Ethan,이 데이터 경로에서 "낮은"작업이 어떻게 작동합니까? 내가 이해했듯이, 당신은 "평등하지 않다"고 설명했다. "slt"명령은 무엇입니까?
osgx

2

실제 CPU가 어떻게 작동하는지 알고 싶다면 다음과 같습니다.

CPU는 특정 크기까지만 작동합니다. 요즘은 일반적으로 64 비트 정수입니다 (부동 소수점 숫자는 무시하고 아이디어는 비슷합니다).

그래서 우리는 그것을 인식해야합니다

  1. CPU는 64 비트 길이의 이진수로 숫자를 어떤 형식으로 저장하고 있습니다 (아마 2 초를 보완 하지만 너무 중요하지는 않습니다).

  2. CPU는 기본적으로 그보다 큰 숫자로 아무것도 할 수 없습니다. 더 큰 숫자를 비교하려면 소프트웨어 알고리즘을 작성해야합니다.

ab

abab0보다 작습니다. 다른 답변에서 설명한 비교 알고리즘과 같이 회로 수준에서 작동 할 수있는 단일 기본 작업 으로이 작업을 수행합니다. 그것들은 많이 비슷하게 보이지만 모든 회로에서 구현됩니다 (숫자는 최대 64 비트이기 때문에 CPU에 고정하고 고정시킬 수있는 특정 크기의 회로입니다). CPU가 숫자를 저장하는 방법에 따라 모든 음수의 첫 번째 비트가 1 또는 그와 비슷한 것으로 설정되어 있기 때문에 더 빠를 수 있습니다. 어느 쪽이든, 총 64 비트 만 있으므로이 숫자가 음수인지 확실히 확인할 수 있습니다.

a<bab

이제 더 큰 숫자를 위해서는 이러한 작은 비교를 서브 루틴으로 사용하는 소프트웨어를 구현해야합니다.


1

이 질문에 대답하기 위해 먼저 컴퓨터, 기계 수준소프트웨어 수준 의 비교 숫자에 대한 추상화 수준이 두 개 이상 있음을 지적하겠습니다 .

기계 수준에서 숫자 비교

오늘날의 컴퓨터에서 CPU에는 풍부한 명령어 세트가 있습니다. 이러한 명령어에는 예를 들어 메모리 셀을 레지스터로로드, 레지스터 증가, 두 레지스터 추가 등이 포함됩니다. 조건부 점프에 대한 지침도 있어야 합니다 . 예를 들어 인텔 x86 제품군의 프로세서는 명령어 jnz(0이 아닌 경우 점프), jne(같지 않은 점프 ) 등을 지원합니다 . 누락 된 CPU는 Turing-complete가 아닙니다. 조건부 점프가 의존하는 변수는 레지스터에 저장됩니다. 따라서 이러한 명령어는 CPU의 아키텍처에서 논리 게이트로 구성된 회로로 하드 와이어 연결됩니다. 이것이 CPU가 두 숫자를 비교할 수있는 유일한 방법 입니다.

소프트웨어 레벨에서 숫자 비교

예를 들어 C ++ 프로그램에서 두 숫자를 비교하면 기계 코드로 변환되므로 기계 수준에서 수행됩니다. 그러나 이러한 비교는 더 복잡 할 수 있습니다. 실제로 비교가 기계 코드로 변환되는 방법을 사용한 데이터 유형에 따라 다릅니다. 한 가지 예를 들어, 비교하려는 숫자는 64 비트 단어에서 온 것이지만 컴퓨터는 32 비트에서만 작동합니다. 그런 다음이 숫자는 레지스터에 맞지 않으므로 컴파일러는 비교를 머신 코드 레벨에서 일련의 비교로 분류합니다. 예를 들어 유리수, 문자열 또는 문자를 나타내는 더 복잡한 데이터 유형 / 데이터 구조에도 동일하게 적용됩니다. 따라서 두 문자를 비교해야하는 경우 소프트웨어 (운영 체제, 컴파일러, 인터프리터 등)에 의해 기계 코드로 변환됩니다.

마지막으로 표준 CPU가 숫자의 다른 표현 (1 또는 2 보수 표현의 부호있는 정수, 부동 소수점)으로도 작동 할 수 있음을 지적하고 싶습니다. 또한 GPU와 같은 컴퓨터의 다른 부분에서도 비교가 수행 될 수 있습니다.


0

CS 풍미 / 트위스트에 대한 추가 고려 사항 / 통찰력을 얻기 위해 다른 답변을 사용하는 것이 좋습니다. 하나는 유한 상태 기계 인 FSM을 구성 하여 가장 중요한 비트에서 쌍으로 시작하여 LSB (최하위 비트)로 작동하는 임의의 길이의 두 개의 이진수를 비교할 수 있습니다. 또한 다른 답변에서 주어진 디지털 비교기를 개념화하는 데 사용될 수 있지만 FSM에는 유한 길이 이진수가 필요하지 않습니다. LSB 다음에 이진 분수가있는 정수에서도 작동 할 수 있습니다. 귀납적이며 재귀 적 풍미를 가지고 있으며 간단한 유도로 올바른 것으로 입증 될 수 있습니다. 다음과 같이 실행됩니다.

  • 상위 2 진 숫자를 한 쌍으로 입력 (a, b)
  • a = 1이고 b = 0이면 왼쪽 숫자가 더 큽니다.
  • a = 0 및 b = 1이면 올바른 숫자가 더 큽니다.
  • 그렇지 않으면 숫자는 "지금까지 동일합니다", 다음 쌍으로 진행하십시오.

다시 말해서, 가장 큰 숫자는 처음 실행 된 0 또는 1 이상의 비트 이후에 첫 번째 비트는 1이고 다른 하나는 0입니다. 게이트 또는 1 비트 비교기로 만들어진 유한 길이의 디지털 비교기는이 FSM 동작의 길이를 고정 된 수의 비트로 고정하는 것에 기초한 것으로 볼 수있다. (그렇습니다. 모든 유한 회로와 FSM 계산의 "길이 고정"사이에는 강력한 대응 관계가 있습니다.)

이것은 이론적 인 연습처럼 보일 수 있지만 실제로 임의의 정밀 숫자 를 나타내는 소프트웨어의 논리는 FSM의 단계를 반복하거나 시뮬레이션하는 것으로 보일 수있는 컴퓨터 루프로 인코딩 된 것을 제외하고는이 FSM과 유사한 것을 작동합니다 (효율적인 구현). 색인을 통해 MSB의 위치를 ​​추적 할 수 있음).


또한이 질문 을 정수로 제한되지 않는 것으로 합리적으로 해석 / 일반화하십시오 . 질문은 정수를 나타내지 만 제목은 숫자 만 나타냅니다. 놀랍게도 지금까지 아무도 부동 소수점 산술을 언급하지 않았습니다.

a×10bab

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.