본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Two's Complement
이진수의 모든 비트를 반전한 뒤 1을 더해 얻는 보수. n비트 수 N 에 대해 2ⁿ − N 과 같다.

현대 컴퓨터가 정수 음수를 표현하는 표준 방식이다. 0의 표현이 하나뿐이고 덧셈·뺄셈 회로를 공유할 수 있어서 1의 보수나 부호-절댓값 방식을 밀어냈다.

  원래 값 : 0 0 1 0 1 1 0 0   (44)
1의 보수 : 1 1 0 1 0 0 1 1
     + 1 : 1 1 0 1 0 1 0 0   ← 2의 보수 (−44)

빠른 방법도 있다. 오른쪽에서부터 처음 나오는 1까지는 그대로 두고, 그보다 왼쪽의 비트를 모두 반전하면 같은 결과가 나온다.

  • 최상위 비트가 1이면 음수다.
  • 0의 표현이 하나(00000000)뿐이다.
  • n비트 표현 범위는 −2ⁿ⁻¹ ~ +(2ⁿ⁻¹ − 1) 로 음수 쪽이 하나 더 넓다. 8비트면 −128 ~ +127.
  • 뺄셈은 A + (B의 2의 보수) 로 계산하고, 최상위에서 발생한 올림은 그냥 버린다. 1의 보수와 달리 순환 자리올림이 없다.
  • 음수의 2의 보수를 다시 구하면 원래 양수로 돌아온다.

최상위 비트에 음의 가중치를 주면 된다. 8비트라면

값 = −b₇·2⁷ + b₆·2⁶ + … + b₀·2⁰

예를 들어 11010100 은 −128 + 64 + 16 + 4 = −44 다.

또 다른 예로 8비트 1111 1100 은

  • 가중치로 읽으면 −128 + 64 + 32 + 16 + 8 + 4 = −4
  • 2의 보수를 다시 구해 읽으면 0000 0011 + 1 = 0000 0100 = 4 이므로 −4

같은 비트열을 부호 없는 수로 읽으면 252, 부호-절댓값으로 읽으면 −124 가 된다. 어떤 표현 방식인지에 따라 값이 다르다.

n비트 2의 보수 덧셈에서 결과가 표현 범위(8비트면 −128 ~ +127)를 넘으면 오버플로(overflow)가 난다.

  • 같은 부호의 두 수를 더했는데 결과의 부호가 다르면 오버플로이다. 부호가 다른 두 수의 덧셈에서는 오버플로가 나지 않는다.
  • 회로에서는 최상위 비트로 들어온 자리올림과 최상위 비트에서 나간 자리올림이 다르면 오버플로로 판정한다. 전가산기 n개로 만든 n비트 가산기에서 최상위 전가산기로 들어가는 자리올림을 Cn-1, 거기서 나오는 자리올림을 Cn 이라 하면 오버플로 플래그 V = Cn-1 ⊕ Cn(XOR)이다. 4비트 가산기라면 V = C3 ⊕ C4 이다. 두 자리올림이 같으면(둘 다 0이거나 둘 다 1) 오버플로가 아니다
    • 예: 0111(+7) + 0001(+1) 은 C3 = 1, C4 = 0 이라 V = 1 이다. 결과 1000 은 −8 로 읽히는 오버플로다
    • 예: 1111(−1) + 0001(+1) 은 C3 = 1, C4 = 1 이라 V = 0 이다. 결과 0000 이 맞고, 밖으로 나간 C4 는 버린다
    • C4 하나만 보는 것은 부호 없는 덧셈의 자리올림 플래그(C)이고, OR·AND 로 두 자리올림을 묶으면 위의 두 경우를 가려내지 못한다
  • 최상위에서 나간 자리올림(캐리) 자체는 오버플로가 아니다. 2의 보수 연산에서는 그냥 버린다.

예: 0x40(64) + 0x41(65)

  0100 0000   (+64)
+ 0100 0001   (+65)
-----------
  1000 0001   → 부호 비트 1, −127 로 해석

참값 129 는 +127 을 넘는다. 두 양수를 더했는데 결과가 음수이므로 오버플로이고, 최상위 밖으로 나간 캐리는 0이다. 언더플로는 부동 소수점에서 0 에 너무 가까운 값을 표현하지 못하는 경우를 가리키는 말로, 정수 덧셈의 이 상황과는 다르다.