어렴풋이 알고 있었는데 정확하게 정리해 보고자 이렇게 글을 써보고자 한다. 과연 컴퓨터는 음수를 어떻게 표현할까?
8비트를 기준으로 아래와 같은 숫자 5가 있다고 생각해 보자.
0 0 0 0 0 1 0 1
음수를 어떻게 표현할 수 있을까? -5를 나타내면 되니까 맨 마지막 자리 수를 양수는 0 음수는 1로 생각하면 어떨까?
1 0 0 0 0 1 0 1
만약에 이 두 수를 더한다면? 결코 0이 나오지 않을 것이다. 결국 그렇다는 것은 덧셈을 할 때 복잡한 방식을 취해야 한다는 것이다. 또한 +0, -0 두 가지 경우의 0이 생기기 때문에 중복을 해결해줘야 하는 문제도 발생한다.
0 0 0 0 0 1 0 1 (5)
+ 1 0 0 0 0 1 0 1 (-5)
--------------------
1 0 0 0 1 0 1 0
➖ 뺄셈을 하는 방법
뺄셈을 하는 방법은 음수를 더해주는 방법이 있다. 예를 들면 5 - 3 는 5 + (-3) 로 표현할 수 있다. 이때 보수라는 개념을 사용할 수 있는데 예를 들면 5 - 3의 경우 10의 보수인 7을 5에 더해주고 마지막 자릿수를 없애주면 된다. 결국 5 - 3 → 5 + (-3) → 5 + 7 → 12 → 2 로 구할 수가 있게 된다. 결국 이진법인 컴퓨터는 2의 보수를 활용해서 뺄셈을 하면 된다.
2️⃣ 2의 보수
2의 보수는 1의 보수에서 1을 더해주면 된다. 이렇게 이야기하는 이유는 0이 있기 때문이다. 0이 있게 되면 2의 보수는 2가 되고 그렇게 되면 한 자리씩 올라가기 때문에 머리가 복잡해진다. 하지만 1의 보수는 구하기가 너무 편하다 왜냐하면 비트를 반전시키면 된다!
우선 아래의 숫자 5를 예시로 들어보자.
0 0 0 0 0 1 0 1
1의 보수를 구하면 아래와 같다.
1 1 1 1 1 0 1 0
그렇게 되면 두수를 모두 더하게 되면 모든 자릿수는 1이 되기 때문에 1의 보수라고 할 수 있다.
0 0 0 0 0 1 0 1
+ 1 1 1 1 1 0 1 0
-----------------
1 1 1 1 1 1 1 1
그렇다면 1의 보수에서 1을 더하게 되면 어떻게 될까?
1 1 1 1 1 0 1 0
+ 0 0 0 0 0 0 0 1
-----------------
1 1 1 1 1 0 1 1
다음과 같은 수가 나오게 되는데 바로 이것이 -5를 2의 보수로 구한 값이다.
그렇다면 5 + (-5) 를 하게 된다면? 아래와 같이 되는데 마지막 자릿수를 없애고 나면 0이 된다.
0 0 0 0 0 1 0 1
+ 1 1 1 1 1 0 1 1
-----------------
1 0 0 0 0 0 0 0 0
이렇게 해서 음수를 나타낼 수 있게 되었다! 하지만 부호없는 정수와 부호가 있는 정수가 구분되게 되었고, 부호가 있는 정수의 경우 최상위 비트 (MSB, most significant bit) 를 통해 음수와 양수를 구분한다.
🍏 Swift에서 정수
아래와 같이 Swift에서는 Int로 부호가 있는 정수(Signed Integer)를 표시하고, UInt로 부호가 없는 정수(Unsigned Integer)를 표현한다.
print(Int8.min) // -128 (10000000)
print(Int8.max) // 127 (01111111)
print(UInt8.min) // 0
print(UInt8.max) // 255
print(Int.min) // -9,223,372,036,854,775,808
print(Int.max) // 9,223,372,036,854,775,807
print(UInt.min) // 0
print(UInt.max) // 18,446,744,073,709,551,615
Int는 양수 19자리, 음수 19자리까지 표현이 가능하다.
'→ Computer Science' 카테고리의 다른 글
[CS] HDD의 구조 및 스케줄링 (0) | 2025.03.26 |
---|---|
[CS] 소수의 표현 (0) | 2025.03.13 |
[CS] 데이터의 전송 (0) | 2025.02.10 |
[CS] 정보단위 (0) | 2025.01.31 |
[CS] 프로세스와 스레드 딥다이브 - 4. 스레드 (0) | 2025.01.18 |
어렴풋이 알고 있었는데 정확하게 정리해 보고자 이렇게 글을 써보고자 한다. 과연 컴퓨터는 음수를 어떻게 표현할까?
8비트를 기준으로 아래와 같은 숫자 5가 있다고 생각해 보자.
0 0 0 0 0 1 0 1
음수를 어떻게 표현할 수 있을까? -5를 나타내면 되니까 맨 마지막 자리 수를 양수는 0 음수는 1로 생각하면 어떨까?
1 0 0 0 0 1 0 1
만약에 이 두 수를 더한다면? 결코 0이 나오지 않을 것이다. 결국 그렇다는 것은 덧셈을 할 때 복잡한 방식을 취해야 한다는 것이다. 또한 +0, -0 두 가지 경우의 0이 생기기 때문에 중복을 해결해줘야 하는 문제도 발생한다.
0 0 0 0 0 1 0 1 (5)
+ 1 0 0 0 0 1 0 1 (-5)
--------------------
1 0 0 0 1 0 1 0
➖ 뺄셈을 하는 방법
뺄셈을 하는 방법은 음수를 더해주는 방법이 있다. 예를 들면 5 - 3 는 5 + (-3) 로 표현할 수 있다. 이때 보수라는 개념을 사용할 수 있는데 예를 들면 5 - 3의 경우 10의 보수인 7을 5에 더해주고 마지막 자릿수를 없애주면 된다. 결국 5 - 3 → 5 + (-3) → 5 + 7 → 12 → 2 로 구할 수가 있게 된다. 결국 이진법인 컴퓨터는 2의 보수를 활용해서 뺄셈을 하면 된다.
2️⃣ 2의 보수
2의 보수는 1의 보수에서 1을 더해주면 된다. 이렇게 이야기하는 이유는 0이 있기 때문이다. 0이 있게 되면 2의 보수는 2가 되고 그렇게 되면 한 자리씩 올라가기 때문에 머리가 복잡해진다. 하지만 1의 보수는 구하기가 너무 편하다 왜냐하면 비트를 반전시키면 된다!
우선 아래의 숫자 5를 예시로 들어보자.
0 0 0 0 0 1 0 1
1의 보수를 구하면 아래와 같다.
1 1 1 1 1 0 1 0
그렇게 되면 두수를 모두 더하게 되면 모든 자릿수는 1이 되기 때문에 1의 보수라고 할 수 있다.
0 0 0 0 0 1 0 1
+ 1 1 1 1 1 0 1 0
-----------------
1 1 1 1 1 1 1 1
그렇다면 1의 보수에서 1을 더하게 되면 어떻게 될까?
1 1 1 1 1 0 1 0
+ 0 0 0 0 0 0 0 1
-----------------
1 1 1 1 1 0 1 1
다음과 같은 수가 나오게 되는데 바로 이것이 -5를 2의 보수로 구한 값이다.
그렇다면 5 + (-5) 를 하게 된다면? 아래와 같이 되는데 마지막 자릿수를 없애고 나면 0이 된다.
0 0 0 0 0 1 0 1
+ 1 1 1 1 1 0 1 1
-----------------
1 0 0 0 0 0 0 0 0
이렇게 해서 음수를 나타낼 수 있게 되었다! 하지만 부호없는 정수와 부호가 있는 정수가 구분되게 되었고, 부호가 있는 정수의 경우 최상위 비트 (MSB, most significant bit) 를 통해 음수와 양수를 구분한다.
🍏 Swift에서 정수
아래와 같이 Swift에서는 Int로 부호가 있는 정수(Signed Integer)를 표시하고, UInt로 부호가 없는 정수(Unsigned Integer)를 표현한다.
print(Int8.min) // -128 (10000000)
print(Int8.max) // 127 (01111111)
print(UInt8.min) // 0
print(UInt8.max) // 255
print(Int.min) // -9,223,372,036,854,775,808
print(Int.max) // 9,223,372,036,854,775,807
print(UInt.min) // 0
print(UInt.max) // 18,446,744,073,709,551,615
Int는 양수 19자리, 음수 19자리까지 표현이 가능하다.
'→ Computer Science' 카테고리의 다른 글
[CS] HDD의 구조 및 스케줄링 (0) | 2025.03.26 |
---|---|
[CS] 소수의 표현 (0) | 2025.03.13 |
[CS] 데이터의 전송 (0) | 2025.02.10 |
[CS] 정보단위 (0) | 2025.01.31 |
[CS] 프로세스와 스레드 딥다이브 - 4. 스레드 (0) | 2025.01.18 |