컴퓨터에서의 수 표현

youngwiki
Pinkgo (토론 | 기여)님의 2025년 3월 13일 (목) 00:57 판

개요

본문에서는 컴퓨터가 정수를 표현하는 방식에 대해서만 다룬다.

0보다 작은 정수 표현하기

sign-magnitude

첫번째 bit를 부호를 지정하는sign bit로 사용하는 방식이다.

  • sign bit 0: 양수 010101012 = +8510
  • sign bit 1: 음수 110101012 = -8510

장점과 단점이 존재한다.

2의 보수법

2의 보수법(Two's Complement)이란 각각의 bit를 다음의 방식으로 해석하는 표현법이다.

xw1(2w1)+n=0w2xi2i

이때 2의 보수법을 적용하는 2진수에서의 first bit를 MSB(Most Significant Bit)라고 한다. MSB가 1이면 음수, 0이면 0이상의 정수이다.

아래는 2의 보수법을 적용하여 해석한 2진수이다.

  • 0b01010 = 0 + 8 + 2 + 0 = 10
  • 0b10110 = -16 + 0 + 4 + 2 + 0 = -10

Unsigned vs Signed

2의 보수법을 적용하여 동일한 2진 벡터를 다른 방식으로 해석할 수 있다. 아래는 그 예시이다.

  • unsigned: 0b10110 = 16 + 0 + 4 + 2 + 0 = 22
  • 2의 보수법: 0b10110 = -16 + 0 + 4 + 2 + 0 = -10

서로 다른 해석법 때문에 2진 벡터의 길이가 w일 때 unsigned 해석법과 2의 보수법은 각각 다른 범위를 가진다.

  • unsigned 범위: 0 ~ 2w-1
  • 2의 보수법 범위: -2w-1 ~ 2w-1 - 1

이때 x > 0이라면, 2의 보수법으로 해석된 음의 정수 -x를 unsigned 방식으로 해석하면 2w-x에 대응한다.

  • B2Sw(1011) = -5, B2Uw(1011) = 11

Unsigned와 Signed 사이의 변환

signed 정수와 unsigned 정수사이에서의 변환은 해당 정수의 bit 패턴을 재해석하여 이루어진다. 오른쪽 그림은 컴퓨터 내에서 explicit 타입 변환이 어떤 방식으로 이루어지는지 보여준다. [1] 또한 Unsigned 정수와 Signed 정수 사이의 변환에는 다음과 같은 관계가 성립한다.

  • S2U(x) = x + 2w × MSB(x)
  • U2S(x) = x - 2w × MSB(x)

또한 C에서의 형변환은 implicitly하게 발생하기도 한다. 예를 들어서 signed 정수와 unsigned 정수가 한 수식 내에서 혼용되어 사용된다면, signed 정수는 unsigned 정수로 암묵적으로 형변환된다.[2]

정수의 연산

unsigned 정수의 덧셈은 bit sequence를 각각의 자릿수에 맞는 bit끼리 더하고 받아올림값이 있다면 이를 적용하며 수행한다.. 이때 carry output이라고 하는 w를 초과하는 자릿수에 해당하는 받아올림값은 무시한다. 이는 결과적으로 modular sum[3]에 해당한다.

signed 정수의 덧셈 또한 unsigned 정수의 덧셈과 거의 유사한 형태로 수행한다. bit sequence의 연산은 unsigned 정수와 동일한 방식으로 하되, 그 결과의 해석을 2의 보수법으로 하면 되는 것이다.

signed 정수의 뺄셈은 x - y를 x + ~y + 1의 형태로 해석한다. 이는 Negwy = ~y + 1과 같기 때문이다.

unsigned 정수의 뺄셈은 x - y를 x + Negwy의 형태로 해석한다. 이때 Negwy = 2w-1이므로 UAddw(x, Negwy) = (x + 2w - 1) mod 2 = (x - y) mod 2와 같이 계산된다. 즉 이를 x와 y의 대소 관계에 따라 정리하면 다음과 같다.

  • If x y, then x - y
  • If x < y, then x - y + 2w (negative overflow)

이때 unsiged와 signed 정수를 연산할 때 그 범위를 초과하는 경우를 Overeflow라고 한다. unsiged 정수의 경우는 덧셈할 때 발생할 경우에는 carry bit를 drop하여 2w을 그 결과에서 뺀 것과 같은 결과를 낸다. 또한 뺄셈할 때 발생할 경우에는 가상의 carry bit를 borrow하여 2w를 그 결과에 더한 것과 같은 결과가 나온다. 다음은 unsigned 정수의 overflow에 대한 예시이다.

  • Addition: 0b1111 + 0b0010 = 0b0001
  • Substraction: 0b0001 - 0b0010 = 0b1111

signed 정수의 overflow은 양수끼리 더할 때[4] 결과가 음수로 나오거나, 음수끼리 더했을 때[5] 그 결과가 양수로 변하여 발생한다. 다음은 signed 정수의 overflow에 대한 예시이다.

  • Addition: 0b0110 + 0b0011 = 0b1001
  • Substraction: 0b1001 - 0b0011 = 0b0110

기타

zero extension

  • unsigned 정수의 경우
    • Task: w-bit unsigned 정수인 x가 주어졌을 때, 이를 동일한 값을 가지는 (w+k)-bit의 수로 변호나하는 것
    • 더 상위의 k bit를 단순히 0으로 채운다.
  • signed 정수의 경우
    • Task: w-bit signed 정수인 x가 주어졌을 때, 이를 동일한 값을 가지는 (w+k)-bit의 수로 변호나하는 것
    • 더 상위의 k bit를 MSB와 동일한 bit로 채운다.


각주

  1. U2B: unsigned 정수를 bit 벡터로 해석 B2S: bit 벡터를 signed 정수로 해석 S2B: signed 정수를 bit 벡터로 해석 B2U: bit 벡터를 unsigned 정수로 해석
  2. 기본적으로 10과 같은 정수 문자열은 signed로 해석된다. 이를 unsigned로 표현하고자 할 때는 10U와 같이 말미에 'U'를 사용하여야 한다.
  3. UAddw(U, V) = (u + v) mod 2w
  4. 양수에서 음수를 뺐을 때
  5. 음수에서 양수를 뺐을 때