C & C++/디딤돌 C언어

Part 4. 부호 있는 정수 표현 방법

언휴 2024. 1. 9. 08:49

Part 4. 부호 있는 정수 표현 방법

12. 부호 있는 정수 표현 - 부호 비트 필드

 

C언어 부호있는 정수 표현, 부호 비트 필드, 1진 보수, 2진 보수

 

메모리에 부호있는 정수를 표현하는 방법은 여러가지 방법이 있어요.

그 중에 대표적인 방법이 부호비트 필드 방식, 1진 보수 방식, 2진 보수 방식이 있죠.(C언어의 정수 형식은 2진 보수 방식을 사용하고 있어요.)

 

이제 이 세가지 방법을 알아봅시다.

 

먼저 부호 비트를 이용하는 방법을 알아볼게요.
부호비트 필드 방식에서는 첫 번째 비트를 부호비트로 사용하는 방식이예요.
첫 번째 비트가 1이면 부호있는 정수이고 0이면 부호없는 정수인 것이죠.
그리고 나머지 비트는 크기를 나타내요.

부호 비트 필드 방식 - 2진수와 10진수 표현 (예: 4비트를 사용)
부호 비트 필드 방식 - 2진수와 10진수 표현 (예: 4비트를 사용)

예를 들어 8비트의 메모리에 10010001 값이 들어있다면 첫번째 비트가 1이므로 부호있는 정수예요.
그리고 나머지 비트인 0010001이 크기를 나타내죠.
이진수 0010001은 16+1 = 17 이므로 10010001은 -17이예요.

 

8비트의 메모리에 00010001 값이 들어있다면 첫번째 비트가 1이므로 부호없는 정수예요.
그리고 나머지 비트인 0010001은 크기를 나타내죠.
따라서 00010001은 17이예요.

 

8비트 메모리에 10000000 값이 있을 때 부호있고 크기가 0인 -0이예요.
그리고 00000000 또한 0이죠.

이처럼 부호비트 필드 방식에서는 -0과 0 두 개가 있어요.


이는 실제 같은 값인데 메모리의 내용이 서로 달라서 처리하는 비용이 들어요.

C언어에서 정수 형식의 값을 표현할 때 부호비트 필드 방식을 사용하지 않는 이유랍니다.

 

1. 8비트의 메모리에 10110111값이 있을 때 부호비트 필드 방식일 때 의미하는 값을 계산하시오.

더보기

답:
맨 처음 비트가 1이므로 음수
나머지 자리가 크기이므로 이진수 0110111 = 16진수 0x37 = 3*16 + 7 = 55
따라서 이진수10110111는 -55

 

2. 8비트의 메모리에 00110111값이 있을 때 부호비트 필드 방식일 때 의미하는 값을 계산하시오.

더보기

답:
맨 처음 비트가 0이므로 부호 없음
나머지 자리가 크기이므로 이진수 0110111 = 16진수 0x37 = 3*16 + 7 = 55
따라서 이진수 10110111는 55

 

3. 8비트의 메모리에 10진수 -116을 부호비트 필드 방식으로 나타내시오.

더보기

답:
음수이므로 부호 비트는 1
116 = 7*16 + 4 = 0x74 = 이진수 111 0100
따라서 10진수 -116은 부호비트 필드 방식으로 표현하면 11110100

13.부호있는정수표현-1진 보수 방식

이번에는 1진 보수를 이용하여 부호있는 정수를 표현하는 방법을 알아볼게요.

 

1진 보수를 이용할 때도 첫번째 비트가 0일 때는 부호없는 정수이며 나머지 비트는 크기예요.
하지만 첫번째 비트가 1일 때는 음의 정수를 나타내며 나머지 비트를 1진 보수를 취한 값이 크기를 나타내죠.

 

먼저 2진수를 1진 보수를 취하는 예를 들어볼게요.


2진수를 1진 보수로 바꿀 때는 각 비트를 0은 1로 바꾸고 1은 0으로 바꾸세요.


예를 들어 2진수 01011010을 1진 보수를 취하면 10100101이예요.

8비트의 메모리에 10010001 값이 들어있다면 첫번째 비트가 1이므로 부호있는 정수예요.
그리고 나머지 비트인 0010001를 1진 보수를 취하면 1101110이죠.
따라서 크기가 64+32+8+4+2 이므로 110이예요.
1진 보수 방식에서 메모리 10010001은  -110입니다.

 

8비트의 메모리에 00010001 값이 들어있다면 첫번째 비트가 0이므로 부호없는 정수예요.
그리고 나머지 비트인 0010001은 크기를 나타내죠.
따라서 00010001은 17을 의미하며 부호비트 필드 방식과 같아요.

 

8비트의 메모리에 00000000값이 있을 때 부호없는 정수 0을 의미하죠.
또한 8비트의 메모리에 11111111일 때 첫번째 비트가 1이므로 나머지 자리를 1진 보수를 취하면 0000000이므로 -0이예요.

1진 보수를 이용하는 방법도 부호비트 필드 방법과 마찬가지로 부호 없는 0과 부호 있는 0이 존재하죠.


이러한 이유로 C언어에서는 부호있는 정수를 표현할 때 부호비트 필드 방식이나 1진 보수 방식을 사용하지 않아요.

1진 보수 방식에서의 2진수와 10진수 표현 (예: 4비트를 사용)
1진 보수 방식에서의 2진수와 10진수 표현 (예: 4비트를 사용)

1. 8비트의 메모리에 10110111값이 있을 때 1진 보수 방식일 때 의미하는 값을 계산하시오.

더보기

답:
첫 번째 비트가 1이므로 음수
1진 보수 방식에서는 나머지 비트를 1진 보수를 취한 것이 크기이므로
0110111 의 1진 보수는 1001000 이고
이진수 1001000 = 64 + 8 = 72 이므로 크기는 72
따라서 1진 보수 방식의 10110111은 -72

 

2. 8비트의 메모리에 00110111값이 있을 때 1진 보수 방식일 때 의미하는 값을 계산하시오.

더보기

답:
첫 번째 비트가 0이므로 부호 없음
1진 보수 방식에서 부호 비트가 0으면 나머지 비트가 크기이므로
이진수 0110111 =  16진수 0x37 = 3*16+7 = 55 이므로 크기는 55
따라서 1진 보수 방식의 00110111은 55

 

3. 8비트의 메모리에 10진수 -116을 1진 보수 방식으로 나타내시오.

더보기

답:
음수이므로 부호 비트는 1
116= 64+32+16+4  = 이진수 1110100
1진 보수 방식에서 음수는 크기를 1진 보수로 취하므로 0001011
따라서 -116을 1진 보수 방식으로 나타내면 10001011

14. 부호있는 정수 표현 – 2진 보수 방식

마지막으로 C언어에서 사용하는 2진 보수 방식을 알아봅시다.

 

2진 보수를 이용할 때도 첫번째 비트가 0일 때는 다른 방법과 같아요.
다른 부분은 첫번째 비트가 1일 때 부호있는 정수를 나타내고 나머지 비트를 2진 보수를 취한 값이 크기로 판단한다는 것이죠.

2진수를 2진 보수를 취할 때는 1진 보수를 계산한 후에 1을 더합니다.

 

예를 들어 8비트의 메모리에 10010001 값이 들어있다면 첫 번째 비트가 1이므로 부호있는 정수죠.
그리고 나머지 비트인 0010001를 1진 보수를 취하면 1101110이예요.
2진 보수는 1진 보수를 계산한 값에 1을 더하므로 11011111이죠.
따라서 크기가 64+32+8+4+2+1 이므로 111이며 부호가 있어서 -110입니다.

 

그리고 8비트의 메모리에 00010001 값이 들어있다면 첫 번째 비트가 1이므로 부호없는 정수예요.
나머지 비트인 0010001은 크기를 나타내어 17을 의미해요.
이것은 다른 방식과 차이가 없죠.

 

2진 보수 방식에서 8비트(1바이트)로 표현할 때 01111111이 제일 큰 정수이고 10000000이 제일 작은 정수예요.

2진 보수 방식을 사용하면 하나의 0만 있어서 연산 처리가 쉬워요.


이러한 이유로 C언어에서는 2진 보수 방식을 사용하고 있어요.

2진 보수 방식에서의 2진수와 10진수 표현 (예: 4비트를 사용)
2진 보수 방식에서의 2진수와 10진수 표현 (예: 4비트를 사용)

1. 8비트의 메모리에 10110111값이 있고 2진 보수 방식일 때 의미하는 값을 계산하시오.

더보기

답:
첫 번째 비트가 1이므로 음수
2진 보수 방식일 때 첫 번째 비트가 1이면 나머지 자리의 2진 보수를 취한 것이 크기이므로
0110111의 2진 보수는 1001001
이진수 1001001 = 64 + 8 + 1 = 73
따라서  2진 방식의 10110111은 -73

 

2. 8비트의 메모리에 00110111값이 있고 2진 보수 방식일 때 의미하는 값을 계산하시오.

더보기

답:
첫 번째 비트가 0이므로 부호 없음
2진 보수 방식에서 부호 비트가 0으면 나머지 비트가 크기이므로
이진수 0110111 =  16진수 0x37 = 3*16+7 = 55 이므로 크기는 55
따라서 2진 보수 방식의 00110111은 55

 

3. 8비트의 메모리에 10진수 -116을 2진 보수 방식으로 나타내시오.

더보기

답:
음수이므로 첫 번째 비트는 1
116= 64+32+16+4  = 이진수 1110100
2진 보수 방식에서 음수는 크기를 2진 보수로 취하므로 0001100
따라서 -116을 2진 보수 방식으로 나타내면 10001100