웹사이트 검색

C 프로그래밍 자습서 4 - 변수 및 메모리


지금까지 이 튜토리얼 시리즈에서는 기본 C 프로그램을 만들고 실행하는 방법, 전처리기란 무엇인지, 변수의 기본 사항에 대해 논의했습니다. 이제 변수를 좀 더 깊이 파고들어 메모리 측면에 대해 논의해 보겠습니다.

지금까지 모든 자습서를 완료했다고 가정하거나(또는 이 자습서를 이해하는 데 필요한 기본 지식이 있음) 이전 자습서 중 하나에서 사용한 간단한 코드 예제부터 시작하겠습니다.

#include <stdio.h>

int main (void)
{
int num = 0, temp=0;
printf("\n Enter a positive integer: ");
scanf("%d", &num);
temp = num;
int result = 1;
while (temp > 0)
{
result = result * temp;
temp = temp -1;
}

printf("\n Factorial of %d is %d\n", num, result);

return 0;
}

보시다시피 이 프로그램은 사용자가 입력한 숫자의 계승을 계산합니다.

이제 5나 6과 같은 더 작은 정수의 경우 이 프로그램이 제대로 작동합니다. 즉, 계승 결과를 올바르게 출력합니다. 그러나 13번에 대해 시도한다고 가정해 보겠습니다. 얻을 수 있는 결과는 다음과 같습니다.

Factorial of 13 is 1932053504

하지만 13의 팩토리얼이 6227020800이므로 이는 사실이 아닙니다. 따라서 당연히 문제는 우리 프로그램이 왜 잘못된 답을 제공했는가입니다. 답은 시스템에서 int 변수가 차지하는 메모리 양에 있습니다.

오늘날 대부분의 시스템에서 int는 4바이트(또는 32비트)의 메모리를 차지합니다. 프로그램에서 다음 줄을 사용하여 시스템에서 int가 차지하는 바이트 양을 알 수 있습니다.

printf("\n int size in bytes is: %d ", sizeof (int));

그리고 int 변수는 음수 값도 저장할 수 있으므로 저장할 수 있는 값의 범위는 -2,147,483,648에서 2,147,483,647까지 다양합니다.

이제 factorial 13이 int 변수가 가질 수 있는 최대값보다 훨씬 크기 때문에 우리 프로그램은 잘못된 출력을 제공합니다. 프로그램을 수정하는 유일한 방법은 6227020800을 저장할 수 있는 변수 유형을 사용하는 것입니다.

더 큰 양의 정수 값을 유지하려면 0에서 4,294,967,295까지의 값을 저장할 수 있는 unsigned int를 사용할 수 있습니다(이 유형의 변수가 시스템에서 4바이트를 차지한다고 가정). 그러나 여기에서는 13의 계승이 최대 용량을 초과하므로 unsigned int도 작동하지 않습니다.

따라서 여기서 우리의 구세주는 long long이 될 것입니다. 이는 8바이트 또는 64비트의 메모리를 차지합니다. 수정된 프로그램은 다음과 같습니다.

#include <stdio.h>

int main (void)
{
long long num = 0; long long temp=0;
printf("\n Enter a positive integer: ");
scanf("%d", &num);
temp = num;
long long result = 1;
while (temp > 0)
{
result = result * temp;
temp = temp -1;
}

printf("\n Factorial of %lld is %lld\n", num, result);

return 0;
}

printf 또는 scanf가 long long 변수를 식별하도록 하는 방법은 %lld(또는 경우에 따라 %I64d)를 사용하는 것입니다. 이 수정된 프로그램이 생성하는 출력은 다음과 같습니다.

Factorial of 13 is 6227020800 

맞습니다.

이제 우리는 int의 한계와 unsigned int와 long long을 사용하여 이를 극복하는 방법을 알게 되었습니다. 오랫동안 명심하십시오. 변수 유형이기도 하지만 오늘날 대부분의 시스템에서 int와 long은 모두 4바이트를 차지합니다.

아, 그리고 예, int, unsigned int 및 long long은 정수용이지만 float 및 double은 부동 소수점 숫자용입니다. Float는 32비트이고 소수점 이하 7자리 정밀도이며 double은 64비트이고 소수점 이하 15자리 정밀도입니다.

부동 소수점 숫자에 대한 언급은 여기서 또 다른 중요한 점을 알려줍니다. 나눗셈과 관련이 있습니다. 이를 이해하기 위해 간단한 C 코드 예제를 살펴보겠습니다.

int main (void)
{
int a=5, b=10;

printf("\n a/b is %d", a/b);

return 0;
}

따라서 이 프로그램은 아무것도 하지 않고 a를 b로 나누거나 5를 10으로 나눕니다.

실생활에서 누군가에게 5/10의 결과를 묻는다면 대부분의 경우 0.5를 답으로 얻을 것입니다. 그러나 여기서 답은 0이 됩니다. 이유는 a와 b가 모두 정수이므로 나누기 결과도 정수로 간주되므로 부동 부분은 무시됩니다.

부동 부분을 보존하려면 a와 b가 모두 부동 소수점 변수인지 확인해야 합니다.

#include <stdio.h>

int main (void)
{
float a=5, b=10;

printf("\n a/b is %f", a/b);

return 0;
}

이 경우 출력은 0.5입니다.

이 자습서에서는 변수 크기와 값 저장에 미치는 영향에 대해 설명했습니다. int, unsigned int, long long, float 및 double을 사용하는 방법과 시기에 대해 좋은 아이디어를 얻으셨기를 바랍니다. 다음 자습서에서는 문자 유형 변수와 배열에 대해 설명합니다.