Integer
정수Integer
양의 정수Positive Integer
정수에는 양수와 음수가 있으므로 부호를 나타내는데 1비트를 사용한다. 맨 앞의 비트가 0이면 양수, 1이면 음수이다. 25를 1바이트 메모리에 저장한다면 0001 1001의 형태를 띈다. 맨 앞의0은 양수, 그 뒤의 00은 빈자리, 11001은 25를 의미한다.
그렇다면 1바이트로 나타낼 수 있는 수의 범위는 어떻게 될까? 1비트가 부호에 할당되어있으므로 0~255개의 수인 -128~127 까지 나타낼 수 있다. 물론 음수를 취급하지 않아 0~255를 나타내는 정수 자료형도 존재한다.
음의 정수Negative Integer
보수Complement
보수란 각 자리의 숫자의 합이 어느 일정한 수가 되게 하는 수이다. 간단하게 ‘보충해 주는 수’이다. 일반화 한다면 \(x\)의 \((x+k)\)에 대한 보수는 \(k\)이다. 컴퓨터는 음수를 보수의 형태로 저장하기에 보수의 개념을 이해해야한다.
간단한 예를 들어보자. 십진수 3의 9의 보수는 3을 더해 9가 되는 숫자인 6이다. 십진수 26의 9의 보수는 각 자리에 더해 9를 만들 수 있는 수인 73이다.
10의 보수
10의 보수는 약간 특별한데, 9의 보수에 1을 더한 것과 같으며, 해당 수를 10의 제곱으로 만들어 주는 수이다.
위의 개념을 통해 123의 9의 보수는 876, 10의 보수는 877임을 알 수 있다.
1의 보수와 2의 보수
1의 보수와 2의 보수는 2진수에서 사용된다. 1의 보수는 수를 반전시켜서, 2의 보수는 해당 수의 1의 보수에 1을 더하여 구할 수 있다.
예를들어 0110의 1의 보수는 1001, 2의 보수는 1010 임을 알 수 있다.
컴퓨터는 음수를 표현할때 2의 보수를 사용하는데, 아래 내용을 통해 그 원리를 알아보자.
음수의 표현
음수인 -4를 어떻게 표현하는지 알아보자.
- 양수 4를 2진수로 나타내면 0000 0100이다.
- 1의 보수를 만들기 위해 반전시키면 1111 1011이다.
- 그렇다면 4의 2의 보수는 1111 1100이다.
>>>(-4).to_byte(1, byteorder='little', signed = True)
b'\xfc'
위 코드는 -4라는 정수를 ‘바이트’형태로 표현하는 코드이다. 16진수로 표현된 출력값인 0xFC를 2진수로 변환하면 1111 1100이다.
>>>bin(0xFC)
0b11111100
그렇다면 왜 음수를 2의 보수로 표현할까?
첫째로, 양수와 음수를 모두 양수처럼 저장하면 0000 0000과 1000 0000은 +0, -0이 된다. 같은 수를 다르게 표현하니 데이터 낭비가 발생하며, 계산에 오류가 발생할 가능성이 존재한다.
둘째로, 컴퓨터가 9-4를 계산할 때 컴퓨터는 가산연산만 가능하므로 9에서 4를 빼는게 아닌 9에 -4를 더한다. (0000 1001) + (1111 1100) = 1 0000 0101 이며, 이때 올림수 1은 버린다. 최종적으로 0000 0101은 5가 된다.
Enjoy Reading This Article?
Here are some more articles you might like to read next: