보수(Complement) - 보충을 해주는 수, 숫자의 합이 일정 수가 될 수 있도록 도와주는 수
N진법에는 N의 보수, N-1의 보수가 있다.
10의 보수 - 10이 되기 위해 필요한 수 (ex. 2의 10의 보수는 8, 7의 10의 보수는 3, 12의 10의 보수는 88), 10^n이 되기 위해 필요한 수
9의 보수 - 9가 되기 위해 필요한 수, 각 자리별 9와의 차이로 얻는 수, 10^n - 1이 되기 위해 필요한 수
큰 수의 경우 먼저 9의 보수를 구한 후 1을 더하면 10의 보수가 된다.
4자리만 표현 가능할 때
540 - 8 = 0540 -0008 = 0540 - 0008 + 10000 - 10000 = 540 + 9992 - 10000 = 10532 - 10000 (여기서 4자리만 표현 가능하니까 첫번째 자리인 1은 표현이 X) = 532 - 0000 -> 0을 뺄 필요가 없어짐, 첫번째 자리인 1이 오버플로우
오버플로우를 사용하면 뺄 필요가 없어지니 빼려는 수의 보수만 구할 수 있다면 덧셈만으로 뺄셈이 가능하게 된다.
15 - 4 = 015 + 996 = 1011 -> 오버플로우 제거하면 = 011
즉, -4 = 996(음수=보수)과 동일하다고 볼 수 있다.
1의 보수 - n자리수를 가진 2진수 n+ (n의 1의 보수) = 2^n -1, 2진수에서는 1이 가장 큰 숫자
1011 + 1011의 1의 보수 = 1011 + 0100 = 1111
N의 1의 보수 = 2^n -1 -N (N의 비트를 뒤집은 것과 같음)
N = 1001
2^4 - 1 = 10000 - 1 = 1111, 1111- 1001 = 0110
1의 보수를 통해 나타낼 수 있는 수의 범위 = -127 ~ -0, +0 ~ +127
-> 0이 +0, -0이 존재하고, 뺄셈 시 오버플로우가 발생해 모든 자리수가 0이 될 경우(2+(-1))에 1을 더해줘야 한다.
2의 보수 - n자리수를 가진 2진수 N의 2의 보수는 2^n - N
N = 1001
2^4 - 1001 = 10000 - 1001 = 0111 = 1의 보수를 구하고(0110) 1을 더한 값과 같음
2의 보수를 통해 나타낼 수 있는 수의 범위 = -128 ~ -1, 0 ~ 127
-> 0이 하나이고, 음수를 처리할 때 1을 더해줄 필요가 없다.
-> 해당 범위를 넘어가는 결과 값이 나올 경우에 오버플로우가 발생해 정상적인 값이 나오지 않는다.
언더 플로우 - 표현할 수 있는 최소값보다 작은 값이 나올 때 발생한다. (부호있는 경우는 -128, 없는 경우는 0) 언더 플로우가 발생하면 최대값부터 다시 시작한다.
'프로그래밍 > 이산 수학' 카테고리의 다른 글
실수 - 고정 소수점, 부동 소수점 (0) | 2023.01.02 |
---|---|
문자 - ASCII, EUC, Unicode, UTF-8 (0) | 2022.12.30 |
데이터 표현 방식 - 정수 (0) | 2022.12.26 |
데이터 표현 방식 - 비트, 바이트 (0) | 2022.12.24 |
숫자 체계 - 진법 Decimal (0) | 2022.12.10 |