본문 바로가기
시스템프로그램

[시스템프로그램]02-2-1 정수의 사칙연산(1)

by 케찹이 2020. 4. 27.

이번 글부터는 시스템속에서 정수값들이 어떻게 사칙연산을 하는지에 관한 글이다. 

 

먼저 순서대로 더하기부터 알아본다.

 

일단은 unsigned인 정수들의 합에 대해 얘기한다. w-bit인 x와y가 존재한다. x와 y의 최대값은  2^w-1값을 갔게 되고 x+y의 최대값은 2^(w+1)-2가 된다. 물론 최소값은 0이다. 밑 그림은 x와 y가 4비트라고 생각했을 때의 최대값과 최소값을 표현한 그래프이다. 

 

x와 y는 unsigned integer이기 때문에 두 값이 합과 상관없이 32bit로 표현해야 된다.

 

그래서 조금 정리를 해보자면 위의 식은 unsigned인 w-bit값들의 합 관련 식이다. 위 그림표를 보면 4비트인 두 수를 더하면 중간쯤에 overflow가 발생하게 된다. 4비트에서 표현할 수 있는 최대값은 15이여서 그 이상의 값들을 표현하게 된다면 overflow가 발생하게 되는 것이다. 그러므로 위의 주어진 식대로 16이상의 수가 결과로 주어졌을 때는 2^4로 빼서 결과로 표현하게 된다. 이에 대해서 몇가지 예를 살펴보자.

-Normal인 경우

(binary)0010 + 0011 = 0101

(decimal)2 + 3 = 5

-Overflow인 경우

(binary) 1001 + 1100 = 10101 -> 0101

(decimal) 9 + 12 = 21 -> 5

이렇게 unsigned에서는 overflow일 경우 주의해야하고 특히 C언어의 특성상 overflow일 경우 오류라고 주의를 주지 않기 때문에 유의하여야 한다. 

 

그럼 이어서 signed(2's complement)일 경우를 살펴본다. 

이것도 위와 같이 w-bit인 x,y가 주어졌을 때 x,y의 최대값은 2^(w-1) -1이고 최소값은 -2(w-1)가 된다. 그럼 둘의 합의 최대값은 2^w - 2이고 최소값은 -2^w이 된다. signed 상황에서도 두 값의 합을 정상적으로 저장을 하게 하려면 w+1비트가 필요로 하지만 그렇게 비트를 늘릴수는 없고 정해진 방식대로 계산을 할 수 밖에 없다. 

이제 비슷한 방식으로 위 그림을 살펴보면 우리가 정상적으로 표현할 수 있는 부분은 위 식에서 Normal이라고 쓰여진 범위이고 위 그림에선 회색으로 색칠된부분이다. 참고로 위 표는 4bit인 상황이고 음수쪽 부분은 잘못 표기되어있다. 그리고 음수를 표현하게 될 경우는 두 합에 2^w를 더한 값이 되겠고 그 반대로 Normal범위보다 더 클 경우에는 -2^w를 더하게 된다. 그리고 각각 커서 초과한 부분은 positive overflow 반대로 작아서 초과한 부분은 negative overflow라고 한다. 그럼 예제를 몇가지 살펴보도록 하자. 

 

x = -5, y = -8, x+y = -13, x +(t,w)y = 3 Negative overflow발생!

[1011]   [1000]        [10011]         [0011]

 

x = 5, y = 5, x+y = 10, x+(t,w)y = -6 Positive overflow 발생!

[0101]    [0101]    [01010]         [1010]

 

이렇게 binary부분에는 MSB값이 truncated되는 방식으로 결과가 나온다. 

 

 

마지막으로 negation을 살펴보자.

negation이란 x란 수에 '-'를 붙이는 것이다. 음수가 되니 당연히 signed수에만 적용할 수 있겠다. w-bit인 x가 있을 때 최대값은 2^(w-1)-1이고 최소값은 -2^(w-1)이다. 그리고 -x는 방금 말한 최대값과 최소값을 바꾸면 되겠다. 

-2^(w-1) <= x <= 2^(w-1) -1

-(2^(w-1)-1) <= -x <= 2^(w-1)

일반적으로 negation을 하게되면 대부분 문제가 없겠지만 x의 최소값을 negation을 하게되면 다시 본인의 값을 표출한다. 그 이유는 당연히 반대에 해당하는 값이 없기 때문이다.  

 

여기까지 정수 산술중 더하기에서만 살펴보았다. 그 다음 글엔 정수의 곱셈, 나눗셈을 배워본다. 

 

댓글