정수 비교는 내부적으로 어떻게 작동합니까?


18

예를 들어 C와 같은 언어로 두 정수를 비교할 때 :

if (3 > 2) {
    // do something
}

3이 2보다 큰지 (true) 아닌지 (false)의 판단은 어떻게 내부적으로 이루어 집니까?


19
현재 답변은 변수 표현식에 대한 비교에 대해서는 괜찮지 만 많은 현대 컴파일러가 코드 조각을 볼 것이라는 면책 조항이 없으며 표현식이 항상 참인지 (리터럴 때문에) 감지하고 if완전히 무시 합니다 바로 코딩으로 이동 do something합니다.
SJuan76


3
@ 눈사람 나는 동의하지 않습니다. "어떻게 작동합니까"프로그래밍 문의는 해당 질문으로 요약 될 수 있지만 중복되지는 않습니다.
user1643723

1
@ user1643723 문제의 함수가 특정 opcode 일 때 수행됩니다.
chrylis

1
@ user1643723 질문은 컴퓨터가 기본 작업을 수행하는 방법에 대한 질문이며, 최상위 답변은 논리 게이트 및 논리 테이블에 대해 설명합니다. 속임수 대상의 최고 답변에서 광범위하게 다루는 두 가지 주제는 질문에 대한 답변입니다.

답변:


61

토끼 구멍으로 내려가는 거지? 알았어 한번해볼 게

1 단계. C에서 기계 언어로

C 컴파일러는 비교를 기계 언어로 저장된 opcode로 변환합니다 . 기계 언어는 CPU가 명령어로 해석하는 일련의 숫자입니다. 이 경우에는 "carry로 빼기"와 "carry 인 경우 점프"라는 두 개의 opcode가 있습니다. 즉, 한 명령어에서 3에서 2를 빼고 다음 명령어는 오버플로되었는지 확인합니다. 여기에는 2와 3의 숫자를 비교할 수있는 위치에로드하기위한 두 개의 명령이옵니다.

MOV AX, 3    ; Store 3 in register AX
MOV BX, 2    ; Store 2 in register BX
SUB AX, BX   ; Subtract BX from AX
JC  Label    ; If the previous operation overflowed, continue processing at memory location "Label"

위의 각각은 이진 표현을 가지고 있습니다. 예를 들어, 코드 SUB2D16 진 또는 001011012 진입니다.

2 단계. ALU로 opcode

산술 연산 코드가 좋아 ADD, SUB, MUL, 및 DIV사용하여 기본 정수 연산 수행 ALU 또는 산술 논리 단위 는 CPU에 내장. 숫자는 일부 opcode에 의해 레지스터 에 저장됩니다 . 다른 opcode는 칩에 ALU를 호출하여 당시 레지스터에 저장된 모든 것에 대해 수학을 수행하도록 지시합니다.

참고 :이 시점에서 우리는 C 와 같은 3GL로 작업 할 때 모든 소프트웨어 엔지니어가 걱정할 수있는 모든 것을 뛰어 넘습니다 .

3 단계. ALU, 반가산기 및 완전 가산기

알고있는 모든 수학 연산을 일련의 NOR 연산으로 줄일 수 있다는 것을 알고 있습니까? 이것이 바로 ALU 작동 방식입니다.

ALU는 이진수로 작업하는 방법 만 알고 있으며 OR, NOT, AND 및 XOR과 같은 논리 연산 만 수행 할 수 있습니다. 이진 덧셈과 뺄셈의 구현은 adder 로 알려진 서브 시스템에서 특정 방식으로 배열 된 일련의 논리 연산으로 수행됩니다 . 이 하위 시스템은 두 비트에서 작동하고 단일 비트 합과 단일 비트 캐리 플래그를 결정하는 "반가산기"네트워크로 구성됩니다. 이들을 묶음으로써 ALU는 8, 16, 32 등의 비트 수로 연산을 수행 할 수 있습니다.

반가산기

뺄셈은 어떻습니까? 빼기는 또 다른 형태의 덧셈입니다.

A - B = A + (-B)

ALU -B는의 2의 보수 를 취하여 계산합니다 B. 음수로 변환되면 가산기에 값을 제출하면 빼기 연산이 발생합니다.

4 단계 : 마지막 단계 : 온칩 트랜지스터

가산기 동작은 트랜시버-트랜지스터 로직 또는 TTL 또는 CMOS 에서 발견되는 것과 같은 "논리 게이트"를 생성하기 위해 상호 작용하는 전기 컴포넌트의 조합을 사용하여 구현됩니다 . 몇 가지 예제를 보려면 여기 를 클릭 하십시오 .

물론 칩에서 이러한 "회로"는 수백만 개의 작은 비트의 전도성 및 비전 도성 재료로 구현되지만 원리는 마치 브레드 보드의 전체 크기 구성 요소 인 것과 동일합니다. 전자 현미경 렌즈를 통해 마이크로 칩의 모든 트랜지스터를 보여주는 이 비디오보십시오 .

몇 가지 추가 사항 :

  1. 작성한 코드는 실제로 컴파일러에 의해 사전 계산되고 런타임시 실행되지 않습니다. 상수로만 구성되어 있기 때문입니다.

  2. 일부 컴파일러는 기계 코드로 컴파일하지 않지만 Java 바이트 코드 또는 .NET 중급 언어와 같은 또 다른 계층을 도입합니다. 그러나 결국 모든 것은 기계 언어를 통해 실행됩니다.

  3. 일부 수학 연산은 실제로 계산되지 않습니다. 그것들은 산술 코 프로세싱 유닛의 거대한 테이블에서 조회되거나 조회와 계산 또는 보간 조합을 포함합니다. 예를 들어 제곱근을 계산하는 함수 가 있습니다 . 최신 PC CPU에는 각 CPU 코어에 부동 소수점 코 프로세싱 장치가 내장되어 있습니다.


3
FWIW, TTL을 참조하는 것은 현대의 프로세서가 거의 TTL 신호를 사용하지 않기 때문에 혼란 스러울 수 있습니다. 대부분 5V BJT 대신 CMOS FET와 낮은 전압을 사용합니다.
whatsisname

2
@whatsisname에서 알 수 있듯이 CMOS 는 TTL보다 더 나은 참조가 될 것입니다. 현대 프로세서에서 진행되는 작업에 더 정확할뿐만 아니라 개념적으로 훨씬 간단하기 때문입니다.
Jules

3
@JackAidley는이 부분에서 의미하는 바입니다. "즉, 한 명령에서 2가 3에서 3을 빼고 다음 명령이 오버플로되었는지 확인합니다."
KutuluMike

1
Nitpicking : CMP사용되지는 SUB않겠지 만, 다시 말하지만 " SUB결과가 무시되고 플래그 만 설정되는 경우"와 거의 동일합니다.
Hagen von Eitzen

5
반가산기와 완전 가산에 대한 정의가 잘못되었습니다. 반가산기는 2 개의 1 비트 입력을 가져와 합계와 캐리를 반환합니다. 완전 가산기는 추가 반입 입력을 사용하지만 여전히 단일 비트입니다. N 비트 가산기를 생성하는 방법은 여러 가지가 있는데, 가장 간단한 방법은 N 개의 완전 가산기 체인 인 리플 캐리 가산기입니다. 실제로 더 큰 Ns의 경우 지연이 상당히 심하므로 최신 CPU 설계에 더 복잡한 설계가 사용됩니다.
Voo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.