- 부호 있는 정수(signed integer), 부호 없는 정수(unsigned integer).
-
,+
를 붙이냐 안붙이냐의 차이.- 컴퓨터는 0과 1밖에 모르는데?
- 8비트 안에서 해결


- 근데 한계가 있음.
- +0과 -0 실제로 같은 값인데 다른 비트 패턴을 가짐.
- 음수와 양수를 더했을 때 오류가 남.


- 그래서 등장한 방법!
보수(complement)
임.
- 보수란?
- 보충하는 수.
- 숫자의 합이 일정 수가 될 수 있게 도와주는 수.
- N진법에는 두 가지 보수가 있음.
- N의 보수
- N - 1의 보수
- ex) 10 진법의 보수는 10의 보수, 9의 보수가 있음.
- 10의 보수
- 10이 되기 위해 필요한 수.
- 2의 10의 보수는 8처럼 10^n이 되기 위해 필요한 수를 말함.
- n은 보수를 구하려는 수의 자릿수에 따라 달라짐.
사실은 이미 쓰고 있었을 수도..!?

- 9의 보수
- 9가 되기 위해 필요한 수.
- 483의 9의 보수는 516 (999 - 483)
- 10의 보수와 9의 보수의 관계
- 10의 보수를 구하는 가장 쉬운 방법.
- 9의 보수를 구한 다음 1을 더하는 것. 특히 9는 큰 수이기에 이 특성을 이용하면 계산이 더 빠름.
- ex) 5483095497의 10의 보수는?

- 보수와 뺄셈

- 폰 노이만이 보수를 이용하여 오버플로우를 이용한 뺄셈할 것을 제안.


⇒ 보수를 이용하면 음수 표현과 뺄셈이 가능해지기에 컴퓨터 설계시 2진법의 두 보수 중 하나를 적용함.
방법 1 : 1의 보수
- 60~80년대 컴퓨터들이 사용한 방법 (현재도 일부 사용).
- n 자릿수를 가진 2진수 N과 N의 1의 보수의 합은 2^n - 1.
- 2^n - 1은 모든 게 1로 구성됨.
- ex) 1011(2) + 1011(2)의 1의 보수 = 1111(2)

- 구하는 방법
- n 자릿수를 가진 이진수 N의 1의 보수는 2^n - 1 - N

여기서 한 가지 팁!
i 가 0과 1이라는 가정하에
(i + 1) % 2
와 1 - i
의 결과가 같음.- 표현 범위

- 1의 보수와 장점과 한계
- 0에 대한 처리가 두 가지임.
- 최대 자리를 넘어 받아올림이 발생한 경우에 +1을 해줘야 함.

방법 2 : 2의 보수
- 현재 부호 있는 정수를 표현하는 가장 흔한 방법.
- n 자릿수를 가진 이진수 N의 2의 보수는 2^n - N

- 더 쉬운 방법.
- 10의 보수와 9의 보수의 관계처럼 1의 보수를 구한 다음 1을 더함.


- 2의 보수의 장점
- 0 표기가 하나고, 음수 처리 시 +1을 할 필요도 없음.
- 오늘 날 음수를 표현할 때 가장 많이 쓰는 방법.
- 많은 프로그래밍 언어 및 CPU가 자체적으로 지원.

- 부호있는 정수의 덧셈, 뺄셈
- 잘 덧셈이 되지만 부호를 표현하는 자릿수를 쓸 경우 오버플로우 발생.
- 이 때 다시 0으로 돌아가는 게 아닌 가장 작은 값으로 돌아간다는 점에 유의하자.
- 한 가지 추가로 최솟값보다 작은 값이 나와야 할 경우지만 오히려 큰 값이 나와버리는 경우
언더플로
가 발생했다고 함.


- 8비트 정수를 예로 들었는데 실제 컴퓨터 언어에는 몇 비트 정수를 쓸까?
- 8비트 단위로 구분함.
- 각 자료형마다 singed, unsigned 특성이 존재. 단 프로그래밍 언어에 따라 unsigned 정수가 존재하지 않을 수 있음. ex) Java
- 가장 많이 쓰는 32비트임. 32비트, 64비트 CPU가 있는 이유와 마찬가지.
- 지금은 컴퓨터가 64비트가 되었지만 아직도 32비트를 기본형으로 쓰는 경우가 많음.

- 즉, 정수면 보통 32비트임.
- 곱셈도 해보자.
- 우선 10진수에서 가장 곱하기 쉬운 형태가 (숫자) x 10^n인 것처럼 2진수도 곱하는 2^n 만큼 자릿수를 옮겨주면 됨.

- 보편적인 2진수의 곱셈
- 10진수랑 똑같이 음수가 하나라면 양수로 바꾸고 계산 후, 음수로 변환, 음수가 두 개라면 양수로 바꾸고 계산.

- 2진수의 나눗셈
