Notice
Recent Posts
Recent Comments
Link
«   2026/07   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

고고

컴퓨터에서 음수를 표현하는 방법 본문

과제

컴퓨터에서 음수를 표현하는 방법

고진서2 2026. 5. 22. 21:19

1. 컴퓨터에서 음수를 표현하는 방법

2. 1.1 + 0.1 == 1.2가 False가 나오는 이유


1. 컴퓨터에서 음수를 표현하는 방법

- 부호비트 (Sign Bit) 란 무엇인가?

부호비트는 숫자의 부호를 나타내기 위해 사용되는 비트이다.

가장 왼쪽 비트가 부호비트이며 0인 경우 양수를, 1인경우 음수를 나타낸다.

 

그러면 5를 이진수로 나타내면 0101인데 -5를 나타내기 위해선 부호비트(맨 앞 비트)가 1101이 되면 되겠네? 

 

라고 생각할 수 있는데 보통 컴퓨터는 그렇게 계산하지 않는다.  이 방식을 부호와 절대치(부호 절대값) 방식이라고 한다.

부호와 절대치 방식
부호비트만으로 부호를 표현하는 방식이다.
0101 (5) 를 음수로 표현하기 위해 1101으로 바꾸는 것이 부호 절대치 방식이다.
최상단 비트를 부호로 사용하므로 나머지 7개의 비트만으로 수를 표현해야 하므로 표현할 수 있는 수는 -127~+127 뿐이다.

 

 

- 1의 보수(One's Complement)란 무엇인가?

보수란? 보충을 해주는 수를 의미한다. 1에 대한 10의 보수는 9, 3에 대한 15의 보수는 12의 개념이다. 

보수는 제한된 자릿수의 정수만을 사용하는 경우 음수를 표현할 때 음의 부호 표현을 사용하는 대신 보수를 이용한다. 예를 들어 -3 대신 3에 대한 9999의 보수인 9996으로 대신 표현하는 것이다. 

 

1의 보수는 주어진 2진수의 비트를 0은 1로, 1은 0으로 각각 변환하는 방법이다.

예를 들어 0101에 대한 1의 보수는 1010이 된다.

 

이때 0을 이진수로 나타내면 0000이고 이를 1의 보수로 바꾸면 1111이 되어 0이 2개가 존재하게 된다.

그렇기 때문에 +0과 -0이 생기는 것이다.

 

이 문제를 해결하기 위해 2의 보수 방식을 사용한다.

 

- 2의 보수(Two's Complement)란 무엇인가?

 

CPU는 기본적으로 더하기만 할 수 있도록 설계되어 있다.그렇기 때문에 빼기를 하기 위해서는 음수를 더하는 방식으로 뺄셈을 처리한다. 이때 사용하는 음수 표현법이 2의 보수이다.

단계 설명 비트형태 (4비트)
1. 원래숫자 양수 3을 이진수로 0011
2. 1의 보수 구하기 모든 비트 반전 1100
3. 1 더하기 결과에 1을 더해 2의 보수 완성 1101

 

- 왜 현대 컴퓨터는 대부분 2의 보수를 사용하는가?

  • 0이 한가지만 존재한다.
    • 앞서 말했듯이 1의 보수를 사용하면 +0과 -0이 생기기 때문에 메모리 낭비와 연산이 복잡해진다.
    • 반면, 2의 보수는 0000하나로만 0을 표현할 수 있다.
  • 뺄셈을 덧셈처럼 똑같이 처리할 수 있다.
    • 컴퓨터에서 5-3을 계산할 때 2의 보수를 이용하면 이렇게 이루어진다.
    • 4비트 연산이므로 자리올림하여 맨 앞의 1이 버려지게 된다. 그럼 최종결과는 0010이 되므로 계산이 올바르게 된다.
   0101  (양수 5)
+  1101  (음수 -3, 즉 3의 2의 보수)
----------------
  10010  (결과값)

 

- 1의 보수와 2의 보수의 차이점

구분 1의 보수 2의 보수
0의 표현 0000(+0), 1111(-0) 2개 존재 0000 하나만 존재
올림수 처리 최상위 비트에서 올림수가 발생하면 결과값에 1을 더함 최상위 비트에서 발생한 올림수를 버림
표현 가능한 수의 범위 $- (2^{n-1} - 1)$ ~ $+ (2^{n-1} - 1)$ $- 2^{n-1}$ ~ $+ (2^{n-1} - 1)$
(음수를 하나 더 표현 가능)

 

 


2. 1.1 + 0.1 == 1.2 가 False가 나오는 이유

 

우리가 생각했을 때는 1.1 + 0.1 = 1.2이다. 하지만 컴퓨터는 동일한지 비교했을 때 False 즉, 아니라고 한다. 

이유를 알아보자

 

일단 컴퓨터는 2진수로 숫자를 저장한다. 모든 소수를 2진수로 표현할 수는 없다.

0.3 => 0.0100110011001100...... 무한 반복...

 

이렇게 2진수로 표현하지 못하는 소수가 발생하므로 어쩔 수 없이 가장 근사치의 값이 컴퓨터에 저장된다.

 

이 근사 값을 저장하는 방법 중 하나가 부동 소수점이다. 

 

- 부동소수점(Floating Point)이란 무엇인가?

영어 뜻대로 소수점이 떠다닌다는 의미이다. 소수점의 위치를 고정하지 않아서 사용하는 비트 수 대비 넓은 범위의 숫자를 표현할 수 있다. 

부동 소수점이란 컴퓨터에서 실수를 근사하여 표현하는 방식이다. 

 

  • 부호비트 : 양수면 0, 음수면 1을 저장
  • 지수부 (Exponent - 8비트): 소수점이 어디로 몇 칸 움직일지 결정하는 스케일러 역할
  • 가수  (Mantissa / Fraction - 23비트): 실제 숫자의 유효숫자들이 들어가는 공간이다.

이 방식을 사용하면 고작 32비트짜리 공간 하나로 극단적인 마이크로 영역부터 매크로 영역까지의 숫자를 다룰 수 있게된다.

 

- 컴퓨터는 왜 10진수를 2진수로 변환해서 저장하는가?

2진수는 기계로 구현하기 용이하며 오류를 최소화하기 위해서 이진수를 사용한다.

컴퓨터는 전기신호의 on/off를 반복하는데 이 신호를 0과 1로 처리한다.

전기신호는 두 가지 상태로 구분하기가 물리적으로 가장 간단하기에 하드웨어 설계와 구현에 있어 효율적이다. 

 

만약, 3진수를 사용한다면 전기 신호를 세 가지 상태로 구분해야 하고, 이는 더 복잡한 하드웨어를 필요로 한다. 

 

- 왜 일부 10진수는 2진수로 정확하게 표현되지 않는가?

소인수 때문이다. 10은 2와 5를 소인수로 가지는데 2진수는 2만 소인수로 갖기 때문이다.

 

0.1 = 1/10 이기에 1/2*5이다. 하지만 2진수는 분모가 2의 거듭제곱 형태일 때만 유한소수로 딱 떨어진다.

그렇기에 0.1을 2진수로 나타내면 소수점 아래가 끝없이 반복되는 순환소수가 된다.

 
- IEEE 754 표준이란 무엇인가?

IEEE 754 표준은  부동 소수점을 저장하고 처리하는 방법을 표준화하여 컴퓨터에서 부동소수점을 사용할 때 일관성을 보장하기 위해 필요하며 가장 널리 쓰이는 표준이다. 

실수 표기 방식, 실수 연산에 관한 규정, 반올림에 관한 규정 등을 정의한다.

 

앞서 말한 부동소수점 형식도 IEEE 754 표준에 따라 설명한 것이다.


- 부동소수점 오차는 실제 개발에서 어떤 문제를 발생시키는가?

  • 조건문이 작동하지 않는 로직 먹통문제
    • 미세한 오차로 false가 반환되어 코드가 정상적으로 동작하지 않게된다
  • 숫자가 커질수록 작은 숫자가 증발하는 정밀도 소실 문제
    • 부동소수점은 한정된 비트 안에서 큰 지수와 유효숫자를 모두 표현해야하므로 아주 작은 숫자가 완전히 무시되는 정밀도 소실이 일어난다.
    • 정밀도 소실이 누적되면 버그가 생길 수 있다.


- 금융/게임/AI 분야에서 소수 오차를 어떻게 처리하는가?

실무에서 가장 기본적인 대응법은 직접 비교를 피하는 것이다.

애초에 부동소수점은 근삿값이기 때문에 == 비교는 위험할 수 있다. 대신 두 값의 차이가 충분히 작은 지를 본다.

"거의 같다고 해도 될 정도인가?"를 묻는 것이다.

 

금융 분야에서는 소수를 사용하지 않고 정수 단위로 처리하는 것이 안전한데 10진수 문자열 형태로 정확하게 다루는 고정 소수점 라이브러리를 사용한다. 파이썬은 decimal 모듈을 사용할 수 있다. 

 

게임 분야에서는 최소한의 오차를 허용하면서 눈속임을 하는 방식을 쓴다. 두 실수 값이 같은지 비교할 때 일치가 아니라 무시할 수 있는 만큼 아주 작은 수인 엡실론(0.000001 같은) 이하의 차이가 나면 같은 값으로 취급한다.

 

AI분야에서는 정밀한 오차보다 얼마나 메모리를 적게 차지하고 대량의 연산을 빠르게 할 수 있는지가 더 중요하다.

양자화(Quantization)와 정밀도 축소로 기존 컴퓨터가 실수를 표현할 때 쓰던 32비트 부동소수점 대신 비트를 과감하게 깎아낸 형식을 도입한다.

'과제' 카테고리의 다른 글

시간 복잡도와 공간 복잡도  (0) 2026.06.05
자료구조 - 해시테이블  (0) 2026.06.04
자료구조 - 트리  (0) 2026.06.03
자료구조 - 단일 연결리스트  (0) 2026.06.01
자료구조 - 배열,큐,스택  (0) 2026.05.30