728x90

int가 사용 word size를 사용하기 때문에 32bit에서는 4byte, 64bit에서는 8byte를 사용한다.

이것은 상당히 유명한 내용이기 때문에 많이들 안다.

그런데 놓치기 쉬운 것은 long 이다.

linux에서 기본적으로 long이 unsigned int 로 되어 있기 때문에 마찬가지로 int와 동일한 크기를 가진다.


좀 더 깊이 들어가면 data model에 따라 조금씩 다르다고 하는데 자세히는 모르겠다


64-bit data models

Data model

short (integer)

int

long (integer)

long long

pointers/
size_t

Sample operating systems

LLP64/
IL32P64

16

32

32

64

64

Microsoft Windows(x86-64 and IA-64)

LP64/
I32LP64

16

32

64

64

64

Most Unixand Unix-likesystems, e.g. Solaris,LinuxBSD, and OS X;z/OS

ILP64

16

64

64

64

64

HAL Computer Systems port of Solaris toSPARC64

SILP64

64

64

64

64

64

"Classic"UNICOS[35](as opposed to UNICOS/mp, etc.)

 

<wikipedia : https://en.wikipedia.org/wiki/64-bit_computing>


간단한 test로 sizeof를 확인해봤다


printf("long: %d\n", sizeof(long));

printf("int : %d\n", sizeof(int));


32bit 
long: 4
int : 4

64bit

long: 8

int : 4


예상과 다르게 int가 4로 나왔다. 역시나 wiki는 똑똑한 사람들이 편집하는구나.

728x90
728x90
#include <stdio.h>
int main()
{
    int number1, number2;
    printf("정수 2개를 입력: ");
    scanf("%d %d", &number1, &number2);
    printf("number1 = %d, number2 = %d", number1, number2);
    return 0;
}

무지 간단한 코드다. 하지만 제대로 된 값이 입력되지 않으면 치명적인 결과가 나올수도 있다. 가령 제대로 된 값이 입력될 때까지 반복문을 돌리는 코드에서 숫자대신 문자를 입력하면 무한루프에 갇히는 경우가 종종 발생한다. 어떻게 처리하는 것이 좋을까?

사람들이 쉽게 지나치는 경우가 많지만 많은 함수가 return값을 제공하고 있다. 가능한 많은 함수의 return값을 생각하라. printf와 scanf의 경우도 마찬가지다. 특히 scanf의 return값을 꽤 유용하고 똑똑하다. scanf는 변수에 제대로 들어간 갯수만큼 return해준다. 만약 위의 코드에서 하나는 숫자 하나는 문자를 입력하면 return값은 1이 된다.
이를 이용해서 간단하게 오류처리를 해보자.

#include <stdio.h>
int main()
{
    int number1, number2;
    do{
        printf("정수 2개를 입력: ");
        fflush(stdin);                          //입력버퍼(stdin)를 비우라는 명령
    }while(scanf("%d %d", &number1, &number2) != 2);
    printf("number1 = %d, number2 = %d", number1, number2);
    return 0;
}

이 코드는 제대로 된 입력값이 들어올 때까지 계속 반복하게 된다.
728x90
728x90

유클리드 호제법 : 기원전 300년경 기하학자 유클리드가 주장하여 그의 이름을 딴 공식으로 알려져 있다.
두 자연수 A,B에 대하여 A를 B로 나누었을 때 몫을 Q, 나머지를 R이라고 하면(A = BQ+R)
A,B의 최대공약수는 B,R의 최대공약수와 같다.
<증명> A,B 둘의 최대공약수 G
A = aG, B = bG (a,b는 서로소)
(A = BQ+R, B = bG 이므로)
bGQ+R = aG
=> R = (a - bQ)G
--------------------------
A = aG
B = bG
R = (a-bQ)G
그러므로 A,B의 최대공약수와 B,R의 최대공약수는 G로 서로 같다.

========================================================================
#include <stdio.h>
unsigned int gcd(unsigned int valuer1, unsigned int value2);
unsigned int lcm(unsigned int value1, unsigned int value2);

int main()
{
    unsigned int value1, value2;
    printf("자연수 2개를 입력하시오 : ");
    scanf("%d %d", &value1, &value2);
    printf("최대공약수 : %d\n", gcd(value1, value2));
    printf("최소공배수 : %d\n", lcm(value1, value2));
    return 0;
}



int lcm(int value1, int value2)
{
        int temp;
        temp = gcd(number1, number2);
        return (number1/temp)*number2;
}

======================================================================
위의 소스는 우선 돌아가는 것 같지만 약점이 있다.
입력값을 전혀 체크하지 않는다는 것! 만약 자연수를 입력하지 않는다면 문제가 발생할 가능성이 크다.
0 0을 입력한다면? 만약 수를 입력하지 않고 문자를 입력해 버린다면?
간단히 오류체크를 추가해서 main을 바꿔보자.

int main()
{
    unsigned int value1, value2;
    do{
        printf("자연수 2개를 입력하시오 : ");
        scanf("%d %d", &value1, &value2);
    }while(value1 <= 0 || value2 <= 0);
    printf("최대공약수 : %d\n", gcd(value1, value2));
    printf("최소공배수 : %d\n", lcm(value1, value2));
    return 0;
}

간단히 do-while을 사용해서 자연수가 아닌 정수(0,음수)는 걸러주도록 했다.
숫자 이외의 값이 입력되는 경우는 찾아보기 쉽게 다른 글로 다시 써야겠다.

728x90
728x90

#include <stdio.h>

unsigned long factorialUsingRecursion(unsigned long n);
unsigned long factorialUsingLoof(unsigned long n);

int main(void)
{
        printf("10! = %lu\n", actorialUsingRecursion(10));
        printf("10! = %lu\n", factorialUsingLoof(10));
        return 0;
}

// 재귀호출을 이용한 factorial계산
// 종료조건(if)을 가장 먼저 적어주는 것에 유의
// 재귀호출은 어떻게 돌아가는지가 중요한 것이 아니라
// 어떤 수식을 그대로 옮겼느냐만 생각하면 된다.
unsigned long factorialUsingRecursion(unsigned long n)
{
        if(n <= 1) return 1;
        return(n*factorial(n-1));
}

unsigned long factorialUsingLoof(unsigned long n)
{
        unsigned long result, i;

        result = 1;
        for(i=2; i<=n; i++)
        {
                result = result * i;
        }
        return result;
}

728x90

+ Recent posts