정수의 저장 원리
Last updated
Last updated
이 문서에서는 정수의 저장 원리에 대해 깊이 있게 다룬다.
컴퓨터는 전기를 이용해 동작하며, 전기를 세게 흘리거나 약하게 흘리는 두 가지 상태를 이용하여 모든 계산을 처리한다. 따라서 데이터 저장 체계도 두 가지 상태인 0과 1로 구분하며 이를 저장할 수 있는 가장 작은 단위를 비트(bit)
라고 부른다.
비트
만으로는 데이터 저장의 한계가 있기 때문에, 비트
들을 모아서 하나의 단위를 구상하였고 8개의 비트
를 모아 바이트
라는 단위를 만들게 된다.
1byte = 8bit = 2^8 종류 = 256종류
1바이트는 256개의 값을 표현할 수 있다. 이를 표현하면 다음과 같다.
00000000
은 0이며 순서대로 번호를 붙이면 11111111
은 255가 된다. 이는 프로그래머 용 계산기를 통해서도 확인할 수 있다. 하지만 숫자에는 부호
라는 것이 존재하기 때문에 무조건 0부터 번호를 붙일 수도 없는 상황이다. 하지만 컴퓨터는 양수와 음수 개념을 모르기 때문에 여기서 보수
가 등장한다.
보수는 진법과 합쳐 2의 보수
, 10의 보수
등으로 불리며, 더하여 밑수가 되는 값을 말한다. 이해를 위해 좀 더 쉽게 설명하면 자리수가 고정일 때, 더해서 0이 되도록 만드는 수가 보수의 정의이다. 2진수일 때는 2의 보수, 10진수일 때는 10의 보수라고 부른다.
만약 자리수가 한 자리인 10진수가 있을 경우, 4에 대한 10의 보는 6
이다.
4와 6을 더하면 10이 나오지만, 한 자리라고 정해져 있기 때문에 1은 버려지고 0만 남게 된다. 이러한 특징을 이용하면 우리는 음수의 개념을 몰라도 값을 유추할 수 있게 된다.
다시 컴퓨터가 사용하는 2진수로 돌아와서 크기를 1바이트로 고정시키고 생각해본다.
1바이트에서 표현 가능한 가장 큰 숫자는 11111111
이다. 이 숫자에 얼마를 더하면 00000000
이 될까?
답은 1
이다.
물론 11111111
과 00000001
을 더하면 100000000
이 되지만, 크기가 1바이트로 고정이기 때문에 넘치는 값(overflow)은 버려진다. 따라서 00000000
, 즉 0이 된다. 따라서 11111111
과 00000001
은 2의 보수 관계이다. 2진수에 있어서는 더해서 0이되는 수라는 의미이다. 이러한 사실들을 바탕으로 우리는 다음과 같이 정리할 수 있다.
11111111
과 00000001
은 더하면 0이된다.
11111111
과 00000001
은 2의 보수 관계이다.
a + b = 0일 때, a가 1이면 b는 -1이다.
00000001
이 1이므로, 11111111
은 -1이라고 볼 수 있다.
즉, -1은 다음과 같이 계산한다.
1의 2진수 값을 구한다.
1번의 모든 자리를 뒤집는다(1의 보수)
2번에 1을 더한다.
이를 기호로 표시하면 다음과 같다.
1바이트를 부호를 고려하여 구분하면 다음과 같이 나눠진다. 값의 범위는 -128
부터 127
까지이다.
2진수 | 10진수 |
10000000 | -128 |
10000001 | -127 |
10000010 | -126 |
... | ... |
11111110 | -2 |
11111111 | -1 |
00000000 | 0 |
00000001 | 1 |
00000010 | 2 |
... | ... |
01111101 | 125 |
01111110 | 126 |
01111111 | 127 |
따라서 부호를 고려하여 1바이트 범위 내에서 계산을 수행할 경우 127 + 1
은 128
이 아닌 -128
이다. 따라서 순환형 구조를 가진다라고 표현한다. 또한 음수들을 살펴보면 맨 앞자리가 1이라는 것을 알 수 있으며 이러한 특징을 이용하여 맨 앞자리를 부호 비트(signed bit)
로 부른다. 주의할 점은 애초에 부호를 고려해서 만든 것이 아니라 만들고 나서 보니 부호 비슷한 역할을 수행한다라고 보는 것이 앞으로 이해에 도움이 될 것이다.
부호를 고려하지 않을 경우 1바이트 범위 내에서 0
부터 255
까지의 값을 가진다.
2진수 | 10진수 |
00000000 | 0 |
00000001 | 1 |
00000010 | 2 |
... | ... |
11111101 | 253 |
11111110 | 254 |
11111111 | 255 |
부호를 고려하지 않을 경우 부호비트
가 발생하지 않는다.
각각의 정해진 크기에 따라 signed
와 unsigned
로 범위를 나누면 다음과 같다.
크기 | signed | unsigned |
1byte | -128 ~ 127 | 0 ~ 255 |
2byte | -32,768, ~ 32,767 | 0 ~ 65,535 |
4byte | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
8byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 ~ 18,446,744,073,709,551,615 |