[Algorithm / DRALG_lec02] 데이터의 표현 : 정수
1. 2진수 변환
컴퓨터는 0과 1을 이용하여 모든 숫자를 표현하므로, 우리가 입력하는 10진수를 2진수로 변환한다.
우리는 이 변환 과정을 공부해야 한다...(웃을때가아님)
① 10진수로 주어진 수를 몫이 1이 나올 때까지 나눈다.
② 이 때, 모든 나머지를 표시한다.
③ 그리고 몫부터 맨 처음의 나머지까지 거슬러 올라가면~! 2진수 변환 끝!!!!
2. 부호가 없는 정수
2진수의 맨 왼쪽부터 자리를 할당한다. 순서대로 2의 n승이며 맨 첫자리는 0승으로 시작한다.
한 자리당 1비트(1bits)이고, 8개의 배수 단위로 사용한다. (8비트 정수, 16비트 정수, 32비트 정수...)
3. 16진수
4개씩 묶어서 숫자를 표시할 수 있다. 이 때, 숫자표현 앞에 0x를 붙여줘야 하는데, 이는 16진수라는 것을 명시적으로 표현한 것이다. 그냥 적으면 10진수로 인식한다. (아마도..)
예를 들어, 11110101이라는 8비트 정수가 있다면, 우리는 이것을 0xF5로 표시할 수 있는 것이다.
같은 방법으로 1001001011011100이라는 16비트 정수가 있다면, 이것을 0x92DC로 표시할 수 있다.
0x10과 10은 같은 수일까?!! 아니다!!! 0x10은 10진수로 바꾸면 16이기 때문이다.
그렇다면 0x05와 5는 같은 수일까?? 맞다 ~.~!! 위의 표를 외우도록 하자...
4. 음의 정수
위의 숫자들은 전부 부호가 없는 양의 정수 표현이다. 그렇다면, 음수를 표현할 수 없는 것일까?
컴퓨터는 음의 정수를 2의 보수로 표현한다.
① 숫자를 2진수 8비트 정수 형태로 표시한다.
② 1의 보수로 바꾼다. (비트 반전)
③ 2의 보수로 바꾼다. (+ 2^0)
굳이 이렇게 하는 이유...가 있다!!
모든 부호가 없는 수에 -를 붙이면 음수가 되는데, 그렇게 되면 -0이라는 수가 생긴다. 하지만 0 = -0 이므로, 메모리 공간이 낭비되는데 이것을 막을 수 있다.
또한 양수만 가지고 있을 경우, 컴퓨터는 덧셈(+)과 뺄셈(-)을 모두 해야하므로 계산에 혼란이 올 수 있다. 그런데 음수로 변환할 수 있다면 덧셈(+) 계산만 하면 되므로 연산이 쉬워진다.
5. 메모리 표현
컴퓨터를 사용해 본 사람이라면 '32비트 / 64비트 운영체제'라고 써있는 것을 본 적이 있을 것이다.
이는 바로 메모리 공간 1바이트(byte)에 대해 32비트 / 64비트 주소를 사용하겠다는 뜻이다.
강의자료에 그림으로 직관적으로 표현되어 있다.
위 메모리 공간은 16진수로 표현된 32비트 주소이다. 0x뒤의 자릿수를 세어 보면 8자리이므로 8 * 4 = 32이다.
같은 방법으로 0xFE0A이면 16비트, 0xEE21B203F0EAFE05이면 64비트 운영체제의 메모리 공간임을 알 수 있다.
(1) 메모리 표현 : 1바이트 정수
메모리를 할당할 때, 랜덤한 메모리 주소를 지정하여 순서대로 할당한다. 예제로 확인하여 보자.
(2) 메모리 표현 : 4바이트 정수
4바이트 정수의 경우 메모리 4개를 한 묶음으로 본다. c와 cpp의 경우 주소로 구분하지만, python의 경우 변수로 구분한다.
6. 엔디언 (endian)
엔디언(endian)은 바이트 단위로 메모리에 데이터를 기록하는 순서를 의미한다.
빅 엔디언과 리틀 엔디언 두 종류가 있는데, 일반적으로 리틀 엔디언을 사용한다고 한다.
① 빅 엔디언 : 큰 부분이 앞으로
② 리틀 엔디언 : 작은 부분이 앞으로
종류 | 0x1234의 표현 | 0x12345678의 표현 |
빅 엔디언 | 12 34 |
12 34 56 78 |
리틀 엔디언 | 34 12 |
89 56 34 12 |