-
훑어보는 서울대학교 컴공 컴개실 2: Bits and Data TypesR&E: research & education/Education 2024. 8. 19. 01:57
서울대학교의 컴퓨터공학부 신입생을 대상으로 2024년 시행된 " 컴퓨터의 개념 및 실습 " ( Digital Computer Concept and Practice ) 과목의 정리자료이다. 1
컴퓨터의 개념 및 실습
Digital Computer Concept & PracticeII. Bits and Data Types
a. 이진표현 ( Binary Representaitons )
모두가 알고 있듯 (디지털) 컴퓨터에서 정보는 2진법으로 표현된다. 2
전선에 전기가 흐르고 있으면 1, 아니면 0이다. 이때 "전기가 흐른다"의 기준은 시스템마다 다르지만, 요즘은 보통 1~3V 정도 된다. 시스템이 발전할수록, 이 기준치는 점점 낮아진다. 3자연스럽게 신호는 둘 중 하나의 상태를 갖게 된다. 1 또는 0.
신호 두 개를 조합하면 네 가지 상태를 갖는다. 00, 01, 10, 11
신호 세 개를 조합하면 여덟 가지 상태를 갖게 된다. ( 이진법으로 000부터 111까지 )
즉, 신호 N개의 조합은 2^N개의 상태를 만들어낼 수 있다.b. 정보표현 ( Represent Information )
만들어낸 이진표현으로 정보를 표현하자. 이진표현과 정보표현의 차이는, 정보는 Context가 있다는 것이다.
예를 들어, 이진표현 0b01010011은 숫자로서 83=0x53을 의미할 수 있지만, 문자로서 'S'를 의미할 수도 있다.
정보 Information = Bits + Context다. 주어진 정보가 어떤 정보인 지 알고 있어야, 정보 해석이 가능하다.
대표적인 데이터의 인코딩은 다음과 같은 것이 있다.
정수: 보통 이진법을 그대로 사용한다. 비트값이 0b0101이라면, 5를 의미한다. 표현하려는 값이 음수라면, 2의 보수를 사용한다. 4 5
문자: 일반적으로 ASCII코드를 사용하는데, 1byte = 8 bit를 하나의 문자에 대응시켜 문자를 표현한다. 예를 들어, 0x43 = 0b01000011은 대문자 알파벳 'C'에 대응된다. 6 7
실수: 일반적으로 IEEE 754의 부동소수점 표기방식을 사용한다. 이 인코딩은 2.?? 에서 설명한다.
c. 비트 연산자 ( Bit-Level Operations )
컴퓨터공학에 크게 관심 있는 사람이라면 비트연산을 알고 있으리라 생각한다.
비트연산에는 크게 and, or, xor 그리고 not이 있다. xor은 exclusive or이라고 하며, 배타적 or 또는 그냥 엑스 or로 읽는다. 각각의 연산은 다음과 같다.
A and B A & B A × B 두 비트가 모두 1일때만 1 A or B A | B A + B 두 비트중 적어도 하나가 1이면 1 A xor B A ^ B A ⊕ B 두 비트가 다르면 1 not A ~A A' A가 0이면 1, 1이면 0 이런 연산은 A와 B가 여러 비트일 때도 적용된다. 8
0101 & 0011 = 0001, 1001 | 0101 = 1101, 0101 ^ 0011 = 0110, ~1001 = 0110
여러 비트에서의 비트연산에는 and, or뿐만이 아니라 shift 연산도 있다.
shift는 부호를 밀거나 당시는 연산자로, "<<"은 왼쪽으로, ">>"는 오른쪽으로 shift를 진행한다. ( 0011 << 1 = 0110 )
몇 가지 비트연산은 사칙연산을 구현하기도 한다.
대표적으로 x * 8을 x << 3으로 대체할 수 있고, x % 8을 x & 0x07로 빠르게 계산할 수 있다.
d. 논리 연산자 ( Logic Operations )
비트연산자와 유사한 연산자로 논리 연산자가 있다. 비트연산자와 논리연산자의 차이는, 논리연산자는 피연산자가 0이면 값은 False로 간주하고 0이 아니라면 값을 무조건 True로 간주한다는 점이다. 9
피연산자가 1이든, 5이든, -1이든 전부 다 True로 간주하고 처리한다. 연산을 한 후, 만약 연산결과가 False라면 0, True라면 1을 반환한다. 10
논리연산자의 성질 덕분에 가능한 것이 early termination이다. 연산 A || B를 수행할 때, 만약 A == True라면 연산결과가 B에 무관하게 True일 것이다. 비슷하게 A && B를 수행할 때 A == False라면 연산결과가 B에 무관하게 False일 것이라 기대할 수 있다. 이런 두 경우에 대해서 컴퓨터는 B를 살펴보지 않고 연산을 끝마친다. 11
e. 정수 표현 1 ( Unsigned Interger Representations )
부호 없는 정수는 이진법 정수와 동일하게 표현된다. 부호없는 정수의 i번째 Digit값이 x_i라면, x = sigma 2^i x_i이다. w비트로 표현할 수 있는 unsigned int의 최솟값은 0 (모든 비트가 0), 최댓값은 2^w - 1(모든 비트가 1)이다.
이진법은 인간이 읽기에 너무 기므로, 통상적으로 1 nibble = 4bit를 한데 묶어 16진법을 사용한다. 0x23은 16*2 + 3 = 35를 나타낸다. 식으로 쓰면 sigma 16^i x_i가 될 것이다. 16진법에서 10은 0x0A, 11은 0x0B, ... 15는 0x0F로 표기한다.
f. 정수 표현 2 ( Signed Integer Representaitons )
디지털 컴퓨터 세상에 '-'같은 문자는 없기에, -3을 0b-0011처럼 표현할 수는 없는 법이다. 부호표현을 위해서 보수 개념을 도입한다.
r진법에는 두 가지 보수가 존재한다: r-1의 보수 그리고 r의 보수. 그러니까, 10진법에서는 9의 보수와 10의 보수가 존재한다. 어떤 정수 x의 9의 보수 x'은 x + x' = 99...9가 되게 하는 값이다. 값 2735의 9의 보수는 7264이다. 2735+7264=9999이기 때문이다. 유사하게, 어떤 정수 x의 10의 보수 x'은 x + x' = 100...0이 되게 하는 값이다. 값 2735의 10의 보수는 7265이다. 2735+7265=10000이기 때문이다. 어떤 수 x의 10의 보수는 x의 구의 보수에 1을 더한 값이다.이진법으로 돌아와서 다시 생각해 보면, 이진법에서 2의 보수는 상당히 매력적인 값이다. 예를 들어, 0b0110의 2의 보수는 0b1010인데, 0b0110 + 0b1010 = 0b0000이 된다. 이에 의거해서 0x1010을 0x-0110, 그러니까 -6으로 생각한다. 0x1010이 +10으로 오인되면 안 되므로, 부호 있는 정수에서 최상위 비트(MSB, Most Significant Bit)가 0이면 양수, 1이면 음수라고 생각하자. w비트로 표현할 수 있는 signed int의 최솟값은 -2^{w-1} (MSB가 1이고 나머지가 모두 0), 최댓값은 2^{w-1}-1이다. (MSB가 0이고 나머지가 모두 1) 12
2의 보수 표현은 MSB의 부호를 바꾼 것으로도 이해할 수 있다. -5의 이진표현은 0b1011인데, 이 값을 -8 + 2 + 1로 이해할 수 있다. 또는 modular 2^w로 이해할 수도 있다. 4bit의 경우 mod 16이 적용된다. 0b1011은 unsigned int에서 값 11을 같는데, 이 값은 mod 16에서 -5와 동치이다.
g. 정수 타입 변환 ( Integer Conversion and Casting )
Signed 정수와 Unsigned 정수 간의 변환은 매우 간단하게 이루어진다. 아니 이루어지지도 않는다. 단순히 같은 비트 데이터를 유지하는 것 만으로 Signed 정수는 Unsigned 정수로 변환할 수 있다. unsigned 숫자 5 = 0b0101를 signed 형으로 바꾸어도 여전히 5 = 0b0101로 표현한다. 다만, 만약 unsigned 정수가 2^(w-1)+1보다 크거나, signed의 정수가 음수라면, casting을 할 때 2^w 만큼의 차이가 발생한다. 4비트 컴퓨터에서, unsigned 숫가 9 = 0b1001은 signed형으로 바꾸면 비트 데이터는 여전히 0b1001이겠지만, 값은 -7로 바뀐다.
h. 정수 크기 확장 및 축서 ( Integer Expansion and Truncating )
정수의 크기를 줄이는 것은 Truncating이라고 한다. w비트의 정수를 w-k비트로 줄이는 경우를 생각해 보자.
이 경우, 컴퓨터는 가장 왼쪽의 비트부터(MSBs) k개의 비트를 버린다.
비트 수가 줄어듦에 따라, truncating에서 값이 바뀔 수 있다.
예를 들어, 8비트 정수 37 = 0b 0100 0101을 4비트로 truncating 하면 0b 0101이 되는데, 이 값은 5로 37과 다른 값이다.
w bit to w-k bit truncating에서 값이 유지되기 위한 조건은 아래 표와 같다.
Signed w bit ~ w-k bit 즉 최상위 k개 비트가 전부 0 Unsigned w bit ~ w-k-1 bit 즉 최상위 k+1개 비트가 전부 0 또는 1 수학적으로 truncating에 의한 값의 변동은 modular와 같다. 8비트 정수 37의 경우 4비트로 truncating 했을 때 5로 바뀌었는데, 이것은 37 mod 16 = 5이기 때문이다.
정수의 크기를 반대로 늘리는 것을 Expansion이라고 한다. w비트의 정수를 w+k비트로 늘리는 경우를 생각해 보자.
컴퓨터는 가장 왼쪽의 비트를 추가하는 형식으로 k개의 비트를 추가한다. 추가되는 비트는 0 또는 1의 값을 가진다.
Zero expansion은 비트를 추가할 때 0을 추가한다. zero extension은 unsigned int의 값을 보존한다.
Sign expansion은 비트를 추가할 때 원래 값의 MSB, 그러니까 부호 비트를 추가한다. sign expansion은 signed int의 값을 보존한다.
signed 8비트 정수 -44 = 0b 1011 0011을 16비트로 zero expansion 하면 0b 0000 0000 1011 0011로 84가 되고, sign expansion하면 0b 1111 1111 1011 0011로 -44가 된다.
i. 정수 연산: 부호 바꾸기 ( Negation )
앞서 어떤 정수 x에 대해 -x를 2의 보수로 표현한다고 이야기했다.
컴퓨터에서 2의 보수는 어떻게 계산될까? 2의 보수는 ~x+1로 계산 가능하다.
먼저 1의 보수를 계산한다. 이진법에서 x의 1의 보수는 ~x와 동일하다. x + ~x = 11...1이 항상 만족되기 때문이다.
그런데 이때 2의 보수는 1의 보수 + 1이므로, x의 2의 보수 = (1의 보수) + 1 = ~x + 1 임을 알게 된다.
j. 정수 연산: 부호 없는 덧셈 ( Unsigned Addition )
각주
- Egger, B. (2024). 035.001 Digital Computer Concepts and Practice. Seoul National University. [본문으로]
- 이진법을 사용하지 않는 아날로그 컴퓨터라는 것도 존재한다 [본문으로]
- 민감도가 증가하니까 [본문으로]
- 2의 보수가 무엇인지는 2.f에서 다룬다. [본문으로]
- 다른 인코딩 방식으로는 Gray 인코딩, BCD 인코딩, excess-3 인코딩이 있다. [본문으로]
- 그러나 사실 아스키코드가 표현할 수 있는 문자의 수는 '\0'값을 포함해도 128개가 한계이다. 최상위 비트가 parity code로 쓰이기 때문. ASCII코드의 8bit는 1 parity bit + 3 zone bit + 4 digit bit로 구성돼 있다. [본문으로]
- 다른 문자 인코딩으로는 EBCDIC 정도가 있다. 한글 인코딩 방식으로는 대중적인 UTF-8과 UTF-16, EUC-KR이 있다. [본문으로]
- 이런 경우 A ⊕ B 같은 표기는 쓰지 않는다. [본문으로]
- 그리고 &&와 || 는 비트연산자 &, | 보타 우선순위가 조금 더 높다. !, ~ >>> && > || > & > ^ > | 식. [본문으로]
- 다만 Javascript는 예외다. C에서 3 || 5를 하면 1이 나오지만, Javascript에서 3 || 5를 하면 3이 나온다. 이는 early termination과도 관련이 있다. [본문으로]
- 이덕분에 가능한 문법으로는 !queue.isEmpty() && queue.front() == 0이 있다. 만약 둘의 순서를 바꿔서 queue.front == 0 && !queue.isEmpty()로 적는다면, queue가 비어있을 때 런타임 에러가 발생할 것이다. [본문으로]
- 물론 실제 2진법이라면 0b10000이겠지만, 디지털 컴퓨터에서 자릿수를 넘어가는 올림은 무시한다. [본문으로]
'R&E: research & education > Education' 카테고리의 다른 글
넓고 얕은 Web 개념집 (0) 2024.08.19