10진수로 변환하면? -> sign bit 확인하기
1111 1111 1111 1111 1111 1111 1111 1100
-2를 표현하려면? -> +2의 2의 보수를 만든다.
1. +2를 2진수로 표현한다. -> a
-> +2 = 0000 0000 0000 0000 0000 0000 0000 0010
2. a의 1의 보수 만든다. -> b
-> 1111 1111 1111 1111 1111 1111 1111 1101
3. b에 1을 더한다. -> c
-> 1111 1111 1111 1111 1111 1111 1111 1110 = -2
2,147,483,647 - (-2) 계산해보자.
-> 2,147,483,647 + (-2)
😀 양수/음수 관계없이 2의 보수로 만들어 덧셈을 한다!
하지만 엉뚱하게 표현되는데 .. 왜일까?
바로 Overflow 때문이다!
Overflow 체크하는 법
1. 같은 부호끼리 더했을 때, 다른 부호가 나오는 경우
2. 양수에서 음수를 뺐을 때, 음수가 되는 경우
3. 음수에서 양수를 뺐을 때, 양수가 되는 경우
.text .globl main main: addi $t1, $0, 0x7fffffff # 에러메시지와 함께 lui, ori로 변환됨 add $t2, $t1, $t1 # overflow 발생! addu $t3, $t1, $t1 # overflow 무시 addiu $t4, $t1, -1 # overflow 무시
- 1 destination
- 2 sources
overflow가 되어도 exception이 발생하지 않는다.