diff --git a/_posts/fast/2024-10-25-os.md b/_posts/fast/2024-10-25-os.md index d54d8c0..416916f 100644 --- a/_posts/fast/2024-10-25-os.md +++ b/_posts/fast/2024-10-25-os.md @@ -13,6 +13,7 @@ tags: ["컴퓨터", "하드웨어", "CPU"] 1. [데이터](#1-1-데이터) 1. [n진법](#1-1-1-n진법) 2. [2진법](#1-1-2-2진법) + 1. [2진법의 음수 표현](#1-1-2-1-2진법의-음수-표현) 3. [그 외 진법](#1-1-3-그-외-진법) 4. [문자의 표현](#1-1-4-문자의-표현) 1. [ASCII](#1-1-4-1-ascii) @@ -116,6 +117,37 @@ tags: ["컴퓨터", "하드웨어", "CPU"] 이 과정을 반대로 하면 10진수를 2진수로 변환할 수 있다. 이 방법 말고도 다른 방법이 있으나, 다른 글을 참고하길 바란다. +#### 1-1-2-1. 2진법의 음수 표현 + +그럼 음수는 어떻게 표현되는가에 대한 궁금증을 가졌을 수 도 있다. + +결론부터 말하면 **2의 보수**를 통해 음수로 변환하여 연산한다. +보수의 사전적 의미는 보충해주는 수인데, 10진법에서 2에 대한 5의 보수는 3이 된다. 필자가 수학을 좋아하진 않으나 자세한 설명은 생략하겠다.. + +2진법에서 1의 보수는 모든 자리의 수를 1로 만드는 수이다. 즉 `0101₂`(5)의 1의 보수는 `1010₂`(10)가 된다. + +그 다음으로 2의 보수는 1의 보수에 1을 더하면 된다. 예를 들어 `0101₂`(5)의 1의 보수는 `1010₂`(10)이고, 2의 보수는 `1011₂`(11)가 된다. +검산을 했을 때 `0101₂` + `1011₂` = `1 0000₂`이 되므로, 2의 보수가 맞다. + +왜 1의 보수와 2의 보수를 설명했냐, 먼저 1의 보수를 이용한 음수 표현을 알아보자. + +음수는 최상위 비트(가장 왼쪽의 비트)를 부호 비트로 사용한다.(`0` = 양수, `1` = 음수) 그리고 남은 비트의 1의 보수를 구하면 음수가 된다. +즉 기존의 양수가 2^8개(256)의 수를 표현할 수 있었다면, 최상위 비트를 부호 비트로 사용하기 때문에 표현 범위는 -127 ~ 127가 된다. + +하지만 여기서 문제점이 발생하는데, 0의 보수 `1111 1111₂`과 0인 `0000 0000₂`, 즉 0이 2개가 된다. 이러한 문제점으로 고안된 것이 2의 보수이며, 오늘날엔 2의 보수를 사용한다. +2의 보수로 설정하게 되면 -128 ~ 127개로 위 문제가 해결된다. + +예시로 `-3 + 5`를 계산 해보자. 3의 2의 보수는 `1111 1101₂`이고, 5는 `0000 0101₂`이다. 이를 더하면 아래와 같다: + +``` + 1111 1101 (-3) ++ 0000 0101 (5) + --------- +1 0000 0010 (2) +``` + +여기서 최상위비트 1은 캐리이다. + ### 1-1-3. 그 외 진법 이 외에도 8진법이나 16진법 등이 있으나, 16진법의 경우 컴퓨터를 다루다보면 자주 등장하는 진법이니 간략히 설명하겠다.