C언어에서 센서 같은 데이터를 처리하다 보면 마이너스 값을 만나게 됩니다
이럴 경우에 C언어에서는 어떻게 음수를 표현하는지 알아보겠습니다
음수를 표현하기 위해서는 현재 표준으로 사용되고 있는 2의 보수법을 알아야 합니다
2의 보수란 어떤 수를 커다란 2의 제곱수에서 빼서 얻은 이진수라는 의미로
대부분의 산술연산에서 원래 숫자의 음수처럼 취급됩니다
주어진 이진수의 모든 자리의 숫자를 반전(XOR)시킨 뒤 1을 더하면 2의 보수 값입니다
0111
해당 이진수의 값은 7인데 이와 반대되는 -7은 어떻게 표현될까요
여기서 먼저 생가해야 할 것은 7과 -7을 더하면 0이라는 값이 나와야 한다는 것인데
가장 적합한 이진수는 1001입니다
0111 + 1001
왜냐하면 두 개를 합하면 10000이 되는데 4비트의 체계에서 맨 앞의 1은 버려지기 때문에
두 개의 합은 0000이 되기 때문입니다
즉 이러한 덧셈을 생각하여 음수를 표현하는 방식을 2의 보수 표현법이라고 합니다
즉 위에서 설명한 것과 같이 2의 보수 체계 하에서 어떤 수의 부호를 바꾸기 위해서는
먼저 비트를 반전(XOR)시킨 뒤에 1을 더하기만 하면 됩니다
즉 -7을 나타내기 위해서는 7의 이진수인 0111의 비트를 모두 반전시킨 뒤
반전된 1000에 1을 더해 1001로 표현을 하면 -7이 됩니다
반대로 -7에서 7로 가기 위해서는 1001의 부호를 반전시킨 뒤
반전된 0110 이진 값에 1을 더한 0111이 구해지게 됩니다
또 어떤 수가 음수인지 양수인지 판단하는 방법도 맨 앞의 비트가 부호 비트라고 생각하면
1101의 경우 맨 앞의 비트가 1이기 때문에 음수라고 판단할 수 있습니다
이 음수 값을 알고 싶다면 보수를 구한 뒤에 -만 붙여주면 됩니다
즉 1101의 보수 0010에서 1을 더하면 0011로 3이 되는데 맨 앞의 비트가 1이기 때문에
최종적으로 구한 수는 -3이라는 것을 알 수 있습니다
'언어 > C언어' 카테고리의 다른 글
[c언어] 문자열을 Int형 정수로 변환하는 atoi함수 (4) | 2022.08.30 |
---|---|
[c언어] 시간을 구하는 strftime 함수 (4) | 2022.08.05 |
json-c 라이브러리 사용 방법 (6) | 2022.05.16 |
메모리 초기화 memset 함수 (8) | 2022.02.07 |
Struct, Union 응용 (14) | 2022.01.25 |
댓글