CS(computer science)/Computer Architecture

데이터의 표현과 컴퓨터 연산

ebang 2022. 12. 2. 16:55
반응형

이번 시간에는 컴퓨터가 어떻게 데이터를 저장하고 처리하는 지 알아볼 것이다.




3.2. 정수의 표현

컴퓨터의 가장 근본이 되는 기능은 수치의 계산이라고 할 수 있다.
이걸 수행하는 가장 핵심적인 장치가 바로 CPU 안에 있는 ALU라고 하는 하드웨어이다.

cpu 안에서 연산을 담담하는 ALU!


컴퓨터는 2진수의 체계로 수를 저장하고 표현한다.
모두가 잘 아는 이진수의 체계인데 한번 더 짚고 넘어가자면,
소수점 이하의 이진수는 2^(-1), 2^(-2) .. 를 의미한다.
ex) 0.101 = 0.5 + 0.125 = 0.625

컴퓨터는 양수 뿐만 아니라 음수도 처리하기 때문에 음수를 표현하는 방법이 필요하다.
이를 수행하는 데에는 여러가지 방법이 있는데, 공통적인 부분은 2진수의 가장 왼쪽 비트가 부호 비트로 사용된다는 점이다.
맨 왼쪽 비트, 즉 최상위 비트는 MSB(most significant bit)라고 불리기도 한다.
부호 비트를 사용하는 2진수 표현으로는 다음과 같은 세 가지 방법들이 있다.

  1. 부호화-크기 표현
  2. 1의 보수 표현
  3. 2의 보수 표현

3.2.1. 부호화-크기 표현

signed-magnitude representation
맨 왼쪽 비트가 부호비트가 되고, 나머지 비트가 수의 크기를 나타내는 방식이다.
이 방식에서 결점은, 덧셈과 뺄셈을 수행하기 위해서는 부호 비트와 크기 부분을 별도로 처리해야 한다는 점이 그렇다. 또한, 0을 표현하는 방식이 -0, +0으로 두 가지라는 점 역시 결점이다.

3.2.2. 보수 표현

보수표현법에는 1의 보수 표현과 2의 보수 표현법이 있다.

1의 보수 표현은, 수의 부호를 바꾸려고 할 때 즉 양수에서 음수로 가거나 음수에서 양수로 갈 때, 모든 비트들을 반전하는 방식이다.
이와 다르게 2의 보수 표현은, 1의 보수 표현과 비슷하게 모든 비트를 반전하되 1을 마지막에 더해주는 방식이다.
예를 들어보면 다음과 같다.
ex)
9 = 0 0001001
-9= 1 0001001(1의 보수 표현법)
-9= 1 0001010(2의 보수 표현법)

1의 보수법의 불편한 점은 다음과 같다.

1) 0을 표현하는 방식이 2가지이다.
편의상 5 비트로 수를 표현한다고 할 때 1의 보수 표현법으로 0을 표현하면 0 0000 과 1 0000 으로 -0, +0이 있다.
2) 연산 시에 음수간의 연산인지, 양수 간의 연산인지 직접 판단하여 값을 더할지 뺄 지 정해주어야 한다.


이와 다르게 2의 보수 표현법의 장점은 다음과 같다.
1) 수를 표현하면 1의 보수와 다르게, 비트 반전 후에 1을 더하면 바로 부호만 변경된 수를 얻을 수 있다.

  1. 0을 표현하는 방법이 1가지이다.

2의 보수 표현법으로 0을 표현하면 0 0000 , 그리고 (1 1111 + 1 = 0 0000) 으로 한가지 방법만 존재한다
2) 1)로 인해, 모든 연산을 더하기로 처리할 수 있게 된다.

위의 장점으로 인해 현대에서는 2의 보수체계로 수를 저장하고 연산한다.
2의 보수를 어떻게 쓰는 지 알아보자.

방법은 두가지가 있다.
1)2의 보수로 표현된 8-비트 음수를 10진수로 표현하는 방법
2)가장 앞의 음수표현에 나머지 수는 더하는 방식으로 할 수 있다.
ex )
A = 10101110

1) A = -128 + (32 + 8 + 4 + 2) = -82

2) 이미 음수임을 알고있으니 양수로 전환 후에 -를 붙여주는 방법도 있다.

10101110 = - (01010001 + 1) = - (1+ 16 + 64 + 1) = -82



3.2.3. 부호-비트 확장

데이터를 더 큰 비트의 수로 형변환하는 경우가 있을 수 있다.
비트가 확장될 때는, 비트의 앞쪽으로 비트가 확장되는데 부호비트와 같은 비트로 확장시킨다.
ex) 10진수 21과 -21에 대한 8-비트 길이의 부호화-크기 표현을 16비트 길이로 확장하자.

21 = 00010101

-21 = 11101011

16비트 확장

21 = 0000 0000 0001 0101

-21 = 1111 1111 1110 1011

→ 확인을 위해  다시 비트 반전하면 0000 0000 0001 0100 이고 

1을 더하면 0000 0000 0001 0101. 값을 계산하면 21이 맞다.

3.3 논리 연산

ALU가 수행하는 기본적인 연산인 산술 연산과 논리 연산 중에서,
산술 연산에서는 데이터의 길이에 맞추어 (예 : 16비트)연산을 하는 반면, 논리 연산에서는 1비트마다 의미를 가지며 각 비트마다 연산을 수행한다.
여기에서는 논리 연산에 대해서 알아보자.
먼저 종류는 다음과 같다.

1) AND 연산

2) OR 연산

3) XOR 연산

4) NOT 연산

:위의 내용은 이미 알고 있거나 쉬운 내용이므로 생략한다.

5) 선택적-세트 연산

: 데이터의 특정 비트들을 1로 세트해주기 위한 동작으로서, 데이터가 저장된 A 레지스터와 세트될 비트들의 위치를 지정해주는 B 레지스터 간에 OR연산을 수행하는 것이다.

ex) A 레지스터에 10010010이 저장되어있을 때, 하위 네 비트를 1로 세트하는 선택적 세트 연산을 수행하라.

   → B 레지스터에 00001111을 넣어두고 A 레지스터와 OR연산을 수행한다.
   결과: 10011111

→ 하위 네 비트가 모두 1로 되었다.

 

6) 선택적 - 보수 연산

데이터 내 특정 비트들의 값을 보수화 하기 위한 동작. 데이터가 저장된 A 레지스터와 반전시킬 비트들의 위치를 지정해주는 B 레지스터 간에 XOR 연산을 수행하면 된다.
ex) A 레지스터에 10010101이 저장되어 있을 때 하위 네 비트의 값들을 반전시키는 선택적 보수 연산을 수행하라.

 B 레지스터의 하위 네 비트에 1을 비트를 저장하여 00001111 을 넣고 XOR을 수행한다.  
A → 10011010

 

7) 마스크 연산

데이터 내 특정 비트들의 값을 0으로 리셋 시키기 위한 동작. AND 연산을 수행하면 된다.
ex) A 레지스터에 10010101이 저장되어 있을 때 하위 네 비트의 값을 0으로 리셋시키는 연산을 수행해라.

  B에 11110000을 넣고 AND 연산을 수행한다. 
  결과: A : 10010000

 

8) 삽입 연산

데이터 내의 일부 비트들을 새로운 값들로 대체시키기 위한 동작으로서, 두 단계로 이루어진다.

  1. 삽입하고자 하는 비트에 대해 마스크 연산
  2. 새로 삽입할 비트들과 데이터 사이에 OR연산

ex) A 레지스터에 10010101이 저장되어 있을 때, 상위 네 비트를 1110으로 대체시켜라.

마스크 연산: B 레지스터에 00001111을 넣고 AND 연산 수행
결과: A : 00000101
1110 0000과 A 레지스터 사이에 OR연산 수행
결과: A: 1110 0101

9) 비교연산

A와 B 레지스터의 내용을 비교하고, 만약 두 레지스터에서 대응되는 비트들의 값이 다르면 A 레지스터의 해당 비틀 0으로 세트한다. 만약 다르다면 A레지스터의 해당위치를 1로 세트한다. 이는 XOR 연산으로 구현할 수 있다.

A : 11010101, B = 10010110

XOR 연산 수행: 01000011

*연산결과가 000..0 이 나온다면 모든 비트들이 동일하다는 뜻으로, 상태 레지스터의 Z flag가 0으로 세트된다. (Z flag : 0일 때 값이 1이 되는 상태 플래그.)

3.4. 시프트 연산

  • 논리적 시프트 :

레지스터 내의 데이터 비트들을 왼쪽 혹은 오른쪽으로 한 칸씩 이동시키는 것.
왼쪽 시프트 할 때는 최상위 비트는 버리게 되고 최하위 비트로는 0이 들어온다.
오른쪽 시프트 할 때는 최상위 비트로는 0이 들어오고 최하위 비트는 버리게 된다.

  • 순환 시프트

논리적 시프트와 비슷하지만, 최상위 혹은 최하위 비트를 버리지 않고 반대편 끝에 있는 비트 위치로 들어가게 한다.
이를 데이터의 비트 수만큼 반복하여 데이터를 이동시키는 ‘직렬 데이터 전송’에도 사용된다.

  • 산술적 시프트

레지스터에 저장된 데이터가 부호를 가진 정수인 경우에 부호 비트를 고려하여 수행되는 시프트이다.
이 연산에서 중요한 것은 시프트 과정에서 부호 비트는 그대로 두고, 수의 크기를 나타내는 비트들만 시프트 시킨다는 점이다.

반응형