1. Addition
bit에서의 덧셈은 십진수의 덧셈과 매우 흡사합니다.
예를 들어 7 + 6 = 10 + 3이 되는 것처럼 10이라는 carry가 발생하게 됩니다.
2. Subtraction
7 - 6은 7 + (-6)과 마찬가지입니다.
따라서 bit에서의 뺄셈도 비슷하게 작용하는데, 2의 보수를 활용합니다.
빼려는 값을 2의 보수로 만들어서 addition을 진행합니다.
위의 상황에서는 맨 앞자리에 1이 carry로 튀어나오는데, 이 값은 무시합니다.
근데 사실 우리가 직접 계산할 때는 굳이 2의 보수로 전환해서 할 필요는 없습니다.
그냥 컴퓨터에서 뺄셈을 하는 방식이 2의 보수를 이용해서 처리하는 것뿐입니다.
3. OverFlow
제한된 비트를 가지고 덧셈과 뺄셈을 하려고 하니 문제가 발생하는데, 바로 overflow입니다.
overflow는 넘쳐흐른다는 의미를 내포하고 있습니다.
32bit architecture에서 두 개의 양수를 덧셈을 했는데, 만약 덧셈 값이 \(2^{31}-1\)보다 크다면 어떻게 될까요?
위와 같은 상황이 발생한다면 MSB가 carry로 인해 1이 될 것입니다.
하지만 이는 2의 보수로 치환된 음수기 때문에 값은 음수로 튀어나옵니다.
양수 + 양수 = 음수는 상식적으로 이해할 수 없기 때문에, 이런 상황을 overflow라고 합니다.
통상적으로 overflow는 양수 + 양수에서 발생하거나,
양수 - 음수에서 발생합니다.
덧셈을 할 때 두 개의 부호가 다르다면 overflow는 절대 발생하지 않습니다.
하지만 두 개의 부호가 같다면 overflow가 발생할 수 있습니다.
뺄셈에서는 두 개의 부호가 같다면 overflow는 절대 발생하지 않습니다.
두 개의 부호가 다르다면 overflow가 발생할 수 있습니다.
만약 overflow가 발생한다면 sign bit는 내가 의도한 바와는 다르게 나옵니다.
이를 표로 나타내면 아래와 같습니다.
4. Overflow Handling
overflow가 무시되어야 하는 메모리 주소에는 unsigned integer을 사용합니다.
주소는 음수가 없기 때문에 가능한 것입니다.
그럼에도 불구하고 overflow가 발생할 수 있는데, 이것은 branch instruction에 의해 쉽게 처리할 수 있습니다.
a + b = s일 때, s가 a보다 작거나 b보다 작으면 이는 overflow가 발생한 것으로 봅니다.
또한 a - b = s일 때, s가 a보다 클 때 overflow가 발생한 것으로 간주합니다.
따라서 branch를 통하여 쉽게 처리가 가능합니다.
다만 이는 컴파일러와 같은 소프트웨어에서 처리해야 하고, 하드웨어에서는 처리할 수 없습니다.
the computer designer must decide how to handle arithmetic overflows.
Although some languages like C and Java ignore integer overflow,
languages like Ada and Fortran require that the program be notified.
The programmer or the programming environment must then decide what to do when an overflow occurs.
다음 글에서는 Multiplication에 대한 글을 적겠습니다.
2022.10.22 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Multiplication
감사합니다.
지적 환영합니다.
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조] Floating Point (2) | 2022.10.22 |
---|---|
[컴퓨터 구조] Multiplication (0) | 2022.10.22 |
[컴퓨터 구조] RISC-V Addressing Mode Summary (6) | 2022.10.22 |
[컴퓨터 구조] Procedure Call (2) | 2022.10.22 |
[컴퓨터 구조] for Wide Immediate Operands : lui (0) | 2022.10.21 |