프로그래밍 언어/C

컴퓨터의 음수와 MSB / LSB

gcreators 2024. 8. 7. 17:54

컴퓨터가 이진수를 저장한다는 것은 이전 글을 통해 알고 계실겁니다.

 

간단하게 산수를 하나 해보겠습니다

 

5 - 5

 

답은 0 입니다 쉽죠?

 

이를 이진수로 바꿔볼까요?

우선 1byte를 할당합니다

 

5는 이진수로

101 입니다.

00000101 이 되겠죠?

 

그런데 음수는 이진수로 뭘까요?

설명하기 전에 MSB와 LSB에 대해 알아 보겠습니다

 

MSB와 LSB는 어떠한 크기의 데이터 형이 있다면, 그 데이터에서 가장 왼쪽에 있는 비트인지 혹은 가장 오른쪽에 있는 비트인지를 나타내는 비트가 되겠습니다

 

LSB는 Least Significant Bit의 약자로서 하나의 데이터 형에서의 가장 낮은 위치의 Bit를 의미합니다

LSB를 보는 것만 으로도 이 데이터가 홀수인지 짝수인지를 알 수 있습니다

 

MSB는 Most Significant Bit의 약자로 어떠한 데이터 형의 최상위 비트를 의미합니다.

기본적으로 Sign Bit(부호비트)를 뜻하는 것으로서 데이터에 대해 특별한 설정이 있지 않는 이상

이 비트에 1이 들어와 있다면 이 데이터는 음수를 뜻 합니다. 이는 조금 뒤에 다시 설명하겠습니다.

 

자 다시 산수로 돌아와서

 -5는

10000101 이 됩니다.

 

이제 계산해볼까요?

5 + (-5) = 0

00000101

       +

10000101

       =

10001010

 

-10? 이라는 이상한 결과가 나와버립니다.

뭔가 이상하네요

 

컴퓨터가 음수를 처리하는 법은 단순히 MSB에 1의 부호비트만 추가 되는 것이 아닙니다

음수 계산의 문제점을 해결하기 위해 보수법이라는 것이 존재합니다.

 

우선은 1의 보수법에 대해 알아보겠습니다.

 

1의 보수 : 각 자릿수의 값이 모두 1인 수에서 주어진 2진수를 빼면 1의 보수를 얻을 수 있습니다.

1111에서 1010을 빼면 0101이 됩니다 1010의 1의 보수는 0101 이되죠 좀 더 간단하게는 그냥 숫자를 역으로 뒤집으면 됩니다.

 

정수 5에 해당하는 이진수인 

0 0 0 0 0 1 0 1  에서

0과 1을 뒤집으면

1 1 1 1 1 0 1 0 이 되는데 이게 0000101의 1의 보수 입니다.

 

2의 보수는 아주 간단한데 1의 보수 결과값에서 1을 더하면 됩니다.

0 0 0 0 0 1 0 1의 2의 보수는

1 1 1 1 1 0 1 1 이 되겠군요

 

이제 이 둘을 한번 더 해볼까요?

 

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

이 되는데 1byte를 할당 했으니 맨 왼쪽에 있는 1은 1byte에 저장되지 못해 0 0 0 0 0 0 0 0이 됩니다.

 

컴퓨터의 음수는 2의 보수를 활용한다는 것을 기억해야 하겠습니다.

 

 

자 음수에 대해 알았고

다시 MSB에 대해 설명하겠습니다.

 

MSB는 기본적으로 부호가 들어오는 비트지만

 

단순 계산으로 8bit의 가장 큰 수인 128을 없애버리고 해당 공간을 차지하기에

 

해당 메모리에 들어갈 값에 절대로 음수가 들어가지 않는 경우라면

 

unsigned 라는 자료형 선언을 통해 부호 비트가 아님을 선언 할 수 있습니다

 

char var = 128;
//풀네임 : signed char        *signed : 부호, 생략 됨
unsigned char var_2 = 128;
printf("var: %d\n", var);
printf("var_2: %d\n", var_2);

 

같은 값을 지니고 있지만 부호비트를 활용하는 var와 부호 비트를 없애버린 var_2의 값은 전혀 다른 결과를 가지고 있습니다.

unsigned 는 적은 메모리로 큰 숫자를 표현하는 용도 뿐만이 아닌

컴퓨터가 부호에 대한 판단을 생략해버리기에 연산속도에 있어서도 이점을 가지게 됩니다.

또한 장점을 하나 더 찾자면 버그 방지도 가능합니다.

음수가 나와선 안되는 계산식에서 unsigned를 선언하지 않아 실수로 음수가 나오도록 만들어 두면 그게 바로 버그가 되는 것이기 때문입니다.

'프로그래밍 언어 > C' 카테고리의 다른 글

연산자(Operators) 와 형변환  (0) 2024.08.08
변수(Variables)  (0) 2024.08.08
자료형(Data Types)  (0) 2024.08.07
프로그램 - 메모리 할당  (0) 2024.08.07
C언어) 소스 파일과 헤더 파일  (0) 2024.08.06