컴퓨터/컴퓨터구조

[1] 컴퓨터 내부의 언어 체계

우유식빵 2022. 4. 5. 22:51

컴퓨터는 비트(bit)를 사용한다.

이는 2진법을 사용한다는 바이너리(binary)와 숫자를 의미하는 디지트(digit)가 합쳐진 말이라고한다. 

비트를 이용한 표현에는 논리 연산, 정수 표현, 실수 표현.. 부터 색을 표현하는 방법까지 다양하다.

 

어떻게 0과 1로 이 모든 것을 표현할까?

 

     1. 논리 연산 

NOT, OR, AND, XOR과 같은 불리언 대수를 이용해서

"비가온다면 코트를 입는다", "학교에 가는 날이 아니라면 공원을 간다"와 같은 문장들을 다룰 수 있다. 

 

     2. 정수의 표현

비트를 이용한 2진수로 값을 표현한다. 

비트의 개수가 32개이면 0~4294967295를 표현할 수 있고 

비트의 개수가 64개이면 0~18446744073709551615의 범위를 표현할 수 있다.

 

2진수에서는 가장 오른쪽의 비트를 변경하면 2진수의 값이 가장 작게 변경되고 왼쪽은 가장 크게 변한다.

그래서 가장 작은 유효비트를 LSB(least significant bit), 가장 큰 유효 비트를 MSB(most significant bit)라고 부른다.

 

정수 표현 방법을 알았으니 산술 연산을 살펴보면,

두 비트를 서로 더한 값은 두 비트를 XOR한 값과 같고 두 비트를 AND한 값이 올림 값과 같다. 

예를 들면 1 + 1을 살펴볼 때 1 XOR 1 = 0, 1 AND 1 = 1이므로 10 이 결과 값인 것 처럼 말이다.

 

덧셈 결과 사용 할 수 있는 비트의 개수로 표현할 수 있는 범위를 벗어나면 오버플로우가 발생한다.

오버플로우는 MSB에서 올림이 발생했다는 뜻이다. 

 

컴퓨터에는 조건코드 레지스터(condition code register)가 있는데, 여기에 "오버플로우 비트"라는 정보를 저장한다.

MSB에서 올림값이 발생하면 오버플로우 비트값에 저장되고 이를 보고 오버플로우 발생을 확인한다.

반대로 MSB에서 1을 빌려오는 경우를 언더플로우라고 한다. 

 

지금까지 양의 정수 표현을 생각해 보았다.

그렇다면 음의 정수 표현은 어떻게 될까?

 

우리는 음수와 양수를 구별하기 위해서 부호(sign)를 사용한다.

음수를 표현하기 위하여 한 비트를 부호에 사용하고 나머지 비트를 수의 크기로 표현하는 방법을

부호와 크기 표현법(sign and magnitude)이라고 한다.

부호와 크기 표현법은 널리 쓰이고 있지 않은데 그 이유에는 두 가지가 있다.

1) 0을 표현하는 방법이 두 가지여서 비용이 낭비된다 (0, -0)

2) 부호와 크기 표현법을 이용하면 XOR과 AND를 통한 덧셈 계산이 불가능하다. 

 

음수를 표현하는 다른 방법으로는 1의 보수(one's complement)가 있다. 

이 방법은 양수의 비트를 모두 뒤집은 값이 음수값이 된다. 

1의 보수 방법도 문제는 존재한다. 덧셈이 어렵다. 덧셈과정에서 순환 올림(end-around carry)이 발생한다.

순환 올림 발생해도 연산을 잘 시킬수있지만 순환 올림을 처리하기 위해서 하드웨어를 추가해야하는 비용이 든다.

 

그래서 현대 컴퓨터에서 특별한 하드웨어를 추가하지 않고 XOR과 AND 연산만 사용하며

부호를 표현하는 방법으로 2의 보수(two's complement)를 사용한다. 

2의 보수는 음수를 표현하기 위해 양수 값에 1의 보수를 취한 후 1을 더한 값을 사용한다.

이 방법은 0의 중복 표현 문제가 없다.

 

     3. 실수의 표현

고정소수점 표현법(fixed-point)은 정수부분과 소수부분 비트를 나누어서 표현한다. 

소수부분 비트에 값이 1일 때 1/2, 1/4... 2의 거듭제곱을 분수형태로 표현한다.

이 방법은 쓸모있는 범위의 값을 표현하기에 필요한 비트의 개수가 너무 많아서 범용컴퓨터에서 잘 안쓰인다.

 

다른 방법으로 부동소수점 표현법(floating-point)이 있다.

이 방법은 2진 소수를 표현하는 가수 부분과 2의 거듭제곱 횟수를 표현하는 지수 부분으로 나누어진다.

부동소수점 역시 한 수를 표현하는데 중복되는 방법이 많을 정도로 비효율적이지만

부동소수점 표현법은 컴퓨터에서 계산을 수행할 때 실수를 표현하는 표준 방법이다.

실수 표현의 정밀도를 높이기 위해 맨 앞에 0이 없도록 만들고 가수의 맨 앞쪽 비트가 1이라고 가정하고 사용하며 

지숫값으로는 127과 같이 편향된 값을 이용한다. 이런 방식을 IEEE 754가 사용한다.

 

IEEE 754는 0으로 나누었을 때 생길 수 있는 양의 무한대/음의 무한대를 표현하는 비트 패턴,

수가 아님을 의미하는 NaN을 표현하는 비트 패턴등을 제공한다. 

 

     4. 진법의 표현

2진수 표현법을 보다보면 비트가 많아 보기 어려울 때가 있다.

이때 8진법, 16진법으로 쉽게 표현할 수 있다.

8진법은 비트들을 3개씩 그룹으로 묶어서 표현할 수 있다.

8진법 보다 16진법이 널리 쓰이는 이유는 컴퓨터 내부가 8비트의 배수를 사용해 만들어지기 때문이다.

(8의 배수는 4로 균일하게 나뉘지만 3으로는 안나뉘기 때문)

- 8진법표현: 숫자의 시작이 0이다. 017은 10진수로 15이다.

- 10진법 표현: 1~9의 숫자로 시작한다.

- 16진법 표현: 0x가 앞에 붙는다. 0x12f는 10진수로 303이다.

 

     5. 텍스트 표현

아스키코드(ASCII, American Standard Code for Information Interchange): 키보드로 표현할 수 있는 기호에 7비트 값을 할당

아스키는 영어를 표현하는데 필요한 모든 문자를 포함하고 있지만 컴퓨터가 널리 쓰임에 따라 그 밖의 언어를 지원할 필요가 커졌다.

비트가격이 떨어짐에 따라 유니코드(Unicode)라는 새로운 표준이 만들어져 문자에 16비트를 부여했다. (현재는 21비트까지 확장)

 

컴퓨터는 7비트 값을 처리하도록 설계되지 않았기 때문에 8비트를 사용해 아스키 문자를 저장한다. 

유니코드 변환 형식 8비트(UTF-8, Unicode Transformation Format-8 bit)방식은

모든 아스키 문자를 8비트로 표현하고 그 밖의 문자의 경우 아스키를 받아서 처리하는 프로그램이 깨지지 않는 방법으로 인코딩한다. 

 

문자를 이용한 수 표현: QP인코딩, base64인코딩, URL인코딩등이 있다.

 

     6. 색의 표현

24비트 for RGB, 8비트 for 투명도. 

웹에서는 16진 트리플렛(hex triplet)으로 표현한다. #rrggbb -> #ffff00은 노랑색이다.

 

     정리

단순히 0/1로 구성된 비트를 사용해서 

아주 큰 숫자, 문자, 색 등 복잡한 요소들을 표현하는 방법에 대해 알아봤다. 

 

 

수의 표현, 문자의 표현, 인코딩 등 프로그래밍을 하면서

무의식적으로 알던 주제들인데 흐름을 거치면서 이해해보는 것은 또 색달랐던 것 같다.

 

부동소수점 표현이 비효율적이라는 것도 처음알았고,

IEEE754 NaN, 무한대 표현등을 실수 비트 패턴으로 인식한다는 것도 처음 알았다. (신기했다)

8진법이 아닌 16진법을 더 많이 사용하는 이유에 대해서 이해할 수 있엇다.

 

 

 

... 한 권으로 읽는 컴퓨터 구조와 프로그래밍 1장을 읽고.