웹사이트 검색

Linux C 프로그래밍 자습서 15부 - 2s 보수 및 음수


이 페이지에서

  1. 2의 보수
  2. 음수
  3. 결론

지금까지 진행 중인 이 C 프로그래밍 튜토리얼 시리즈에서 꽤 많은 개념에 대해 논의했지만 기본 개념을 놓쳤습니다. 음수에 관한 것입니다. 예, 초기 자습서 중 하나에서 부호 있는 변수와 부호 없는 변수에 대해 간략하게 언급했지만 실제로 음수가 메모리에 저장되는 방법에 대해서는 논의하지 않았습니다.

이것이 바로 이 튜토리얼에서 논의될 내용입니다. 따라서 더 이상 고민하지 않고 토론부터 시작하겠습니다.

2s 보수

메모리의 음수 표현에 대한 설명을 시작하기 전에 1과 2의 보수 개념을 아는 것이 중요합니다. 둘 다 이진 수준 연산입니다.

아주 간단한 예를 들어보겠습니다. 10진수 값이 15인 4바이트 정수 a가 있다고 가정합니다. 그런 다음 이진 형식 메모리로 표현되는 방법은 다음과 같습니다.

00000000 00000000 00000000 00001111

이제 1의 보수를 계산하려면 모든 비트를 반전하면 됩니다. 따라서 다음은 15의 1s 보수 표현입니다.

11111111 11111111 11111111 11110000

이제 위의 이진 표현에 1을 더하면 2의 보수를 얻습니다.

11111111 11111111 11111111 11110001

따라서 위의 표현은 15의 2의 보수입니다.

음수

자, 여러분 중 일부는 왜 우리가 1s 및 2s 보수에 대해 논의했는지 생각하고 계실 것입니다. 답은 음수의 이진 표현이 2의 보수를 통해 계산된다는 사실에 있습니다.

믿기 어렵습니까? 증거는 다음과 같습니다.

이전 섹션에서 계산한 2의 보수는 0xFFFFFFF1과 같은 16진수 형식으로 나타낼 수 있습니다. 이제 이 값이 C 프로그램을 통해 10진수 형식으로 무엇인지 살펴보겠습니다.

코드는 다음과 같습니다.

#include <stdio.h>

int main()
{
int a = 0xFFFFFFF1;
printf("a = %d", a);

return 0;
}

그리고 다음은 출력입니다.

a = -15

지금 믿으세요? 우리는 숫자 15로 시작하여 2의 보수를 계산하고 2의 보수 값을 다시 십진수로 변환했을 때 -15를 찾았습니다.

계속해서 코드를 약간 수정하여 printf 호출이 변수 a 부호 없는 정수로.

#include <stdio.h>

int main()
{
int a = 0xFFFFFFF1;
printf("a = %u", a);

return 0;
}

출력 결과는 다음과 같습니다.

a = 4294967281

죄송합니다. 출력이 변경되었으며 이제 엄청난 양수 값입니다. 그런데 왜 이런 일이 일어 났습니까? 0xFFFFFFF1은 앞에서 본 것처럼 15의 2의 보수가 아닙니까?

예, 0xFFFFFFF1은 15의 2의 보수이지만 그 관점에서 보지 않으면 정상적인 값(4294967281)이기도 합니다. 차이점은 어떻게 읽느냐에 있습니다. 부호 있는 정수로 읽으면(printf에서 %d를 통해) 출력이 -15로 표시되지만 부호 없는 정수로 읽으면(printf에서 %u를 통해) 출력이 4294967281로 표시됩니다.

음수와 양수 값을 모두 처리하는 부호 있는 변수의 경험 법칙으로 음수의 이진 표현은 항상 가장 왼쪽 비트가 1인 반면 양수의 경우 문제의 비트는 항상 0입니다.

마지막으로, 2의 보수 표현을 반전시켜 양수 대응을 얻을 수도 있습니다. 예를 들어 -15의 16진수 표현인 0xFFFFFFF1 값을 다시 사용하겠습니다. 다음과 같이 이진 형식으로 표시됩니다.

11111111 11111111 11111111 11110001

이제 양수를 얻으려면 2s 보수를 다시 수행하십시오. 즉, 먼저 1의 보수를 수행합니다.

00000000 00000000 00000000 00001110

그리고 1을 더한다

00000000 00000000 00000000 00001111

이제 이것을 변환하면 십진수 형식으로 값 15를 얻게 됩니다.

결론

이 튜토리얼이 메모리에서 표현되는 방식과 관련하여 음수의 개념을 이해하는 데 도움이 되었기를 바랍니다. 이 자습서에서 사용한 예제를 시도해 보고 문제가 발생하거나 의심이 가거나 질문이 있는 경우 아래에 의견을 남겨주세요.