ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 0x01 상수
    Legacy/C 2014. 12. 14. 04:20
    728x90

    이 장부터가 직접적인 C에대한 설명입니다. 

    C를 처음 접해보시는 분들은 아직 배우지 않았는데 나오는 것에 대해선 그냥 넘어가세요. 뒤에 천천히 설명해 드릴겁니다.

     

     다음은 아주 기본적인 C 프로그램입니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdio.h>
     
    int main()
    {
        int area, width, height;
        
        width = 3;
        height = 4;
        area = width * height;
        
        printf("면적 = %d \n", area);
        
        return 0;
     


    Line 1. 전처리기 지시 영역으로 헤더파일을 추가하고 있습니다. 헤더파일이란 프로그램에 필요한 함수들을 미리 정의해둔 것인데, 위 프로그램에선 printf함수가 stdio.h 헤더파일에 미리 정의되어 있어서 사용할 수 있는 것입니다. 그런데 여기서 만약 stdio.h 헤더파일을 포함시키지 않았다면 어떤 일이 벌어질까요? 그건 직접 해보시면 알 수 있습니다. 

     

    Line 3. main 함수의 시작으로서 컴파일러는 프로그램의 어떤 부분 보다도 이 main 함수를 먼저 컴파일 하기 시작합니다.

     

    Line 5. 함수의 변수 선언 부분입니다. 여기선 3개의 변수가 모두 int(정수형)으로 선언되었습니다. 여기서 주의할 점은 모든 변수는 사용되기 전에 선언을 먼저 해주어야 한다는 것입니다. 만약 Line 5를 Line 9 뒤에 써주었다면 어떻게 될까요?

     

    Line 7 ~ Line 9. 각각의 변수에 값을 대입해 주고 있는 부분입니다. area 변수에는 3(width) * 4(height)가 입력되므로 12가 대입됩니다.

     

    Line 11. printf 함수가 나옵니다. 여기서 %d란 변환명세 혹은 포맷스트링(Format String)이라고 합니다. 그리고 나오는 \n은 개행(Enter키를 누른 것처럼 한줄 밑으로 내려감)이며 콤마(,) 뒤에 area 변수가 오는데 이것은 앞에나온 %d에 area 변수 값이 대응되도록 합니다.

    여기서 printf 함수에대해 알아야 할텐데요, printf 함수는 표준 출력장치(대개는 모니터)로 문자열을 출력해주는 함수입니다. printf 함수의 형태는

    printf("형식문자열", 변수명 혹은 수식 혹은 숫자)으로 이루어지는데 여기서 변수명은 여러개가 올 수가 있습니다.

    ex) printf("길이 = %d, 높이 = %d, 넓이 = %d", width, height, area); // 이렇게 쓰면 첫번째 나오는 %d는 width가, 두번째 나오는 %d는 height가, 세번째 나오는 %d에는 area가 대응됩니다. 여기서 변환명세의 개수와 변수의 개수가 다를경우에는 어떻게 되는지 직접 실행해 보세요.

     

    LIine 13. return 0; 라는 0을 반환한다는 내용인데요, 이건 시스템에게 0이라는 값을 전달해서 프로그램이 정상적으로 작동되고 또 종료됨을 알려주는 것입니다. 이것을 반환값이라고 하는데요 반환값에 대한 내용은 함수 부분에서 자세히 다룰 것이니 신경쓰지 않으셔도 됩니다.(신경쓰지 말라고 코딩시 생략해도 된다는 의미가 아닙니다! 생략할 경우 어떻게 되는지도 한번 실행해 보세요.)

     

     

    여기서부터가 이제 이번 장의 본론입니다.

     

    컴퓨터는 0과 1이라는 두가지 수만을 이용해서 자료를 표현합니다. 또한 컴퓨터가 다루는 표현법에는 3가지가 있습니다. 

     

    1. 문자

    2. 정수

    3. 실수

     

    위와같이 3가지가 있습니다. 우선 문자에 대해 이야기를 해볼 텐데요, 문자를 이야기하려면 빠질 수 없는 것이 바로 ASCII(American Standard Code for Information) 코드 입니다. 워드프로세서나 컴퓨터활용능력 자격증을 따신 분이라면 한번 쯤 들어보셨을 만한 아스키 코드인데요, 컴퓨터에서 문자는 고유 번호를 부여한 코드로 변환되어 표현되는데 이를 문자 체계(Chracter System)이라고 합니다. 대표적인 문제 체계가 바로 이 ASCII 코드 입니다. ASCII 코드는 7비트를 사용해서 128개의 문자, 숫자, 특수 문자에 고유 번호를 부여합니다.

    ex) 문자 A('A')는 2진수로 1000001로 변환됩니다. 컴퓨터는 자료의 최소 표현 단위가 1바이트이므로 최상위 비트에 0을 추가해 01000001(10진수의 65)로 표현합니다. 또한 1(숫자 1)과 '1'(문자 1)은 서로 다른 것입니다. ASCII 코드는 인터넷에 '아스키코드표'라고 검색해보시면 그 분류 체계 찾아볼 수 있습니다. 자주 사용되는 '0'과 'A', 'a'의 코드 값을 외우면 좋고, 꼭 기억해둬야 할 점은 '0'다음에 '1', '2' 식으로 그 순서가 0123456789 순으로 올라간다는 것, 알파벳 또한 'A', 'B', ... 식으로 올라간다는 점 등을 기억해주시면 좋습니다.

     

    다음으로 정수의 표현법에대해 알아보겠습니다. 수학시간에도 배웠다시피 정수는 음의정수, 0, 양의정수로 나뉘게됩니다. 컴퓨터는 양의정수는 물론 음의정수 또한 2진수로 표현을 하는데요, 12를 8비트(1바이트)로 표현하면 1100이고 남은 4비트를 0으로 채워주면 00001100이 됩니다. 그러면 -12는 -00001100일까요?? 아닙니다. 컴퓨터는 모든 수를 2진수로 표현하기 때문에 -와 +는 사용하지 않습니다. 오직 0과 1만으로 모든 것을 표현합니다. 그러면 음수는 어떻게 표현할까요? 음수를 표현하기위해 컴퓨터에는 보수(complement)의 개념이 들어옵니다. 말 그대로 '보충해 주는 수'라는 의미인데요, 7과 -7이 있을 때 이 두 수를 더하면 0이 됩니다. 컴퓨터는 더하기는 할줄 알지만 빼기는 할줄 모릅니다. 그래서 -7을 8비트로 표현하기위해 2의 보수라는 것을 구해주어야 합니다. 또 2의 보수를 구하려면 1의 보수 또한 구해주어야 합니다. 이제 직접 1의 보수와 2의 보수를 구하는 법을 알려드리겠습니다.

    7은 8비트로 표현하면 0000 0111입니다.

    1의보수는 모든 비트를 반전시켜주는 겁니다. 0은 1로, 1은 0으로 말이죠.

    그러면 -7의 1의보수 표현법은 1111 1000이 됩니다.

    2의보수는 1의보수에 1을 더해주면됩니다.

    그러면 1111 1001이 -7의 2의보수 표현법이 됩니다.

    그러면 이제 0000 0111(7)과 1111 1001(-7)을 더해보겠습니다.

     

        0000 0111  =  7

    +   1111 1001  = -7

    =   0000 0000

     

    8비트를 넘어가는 수는 버리므로 결국 7+(-7)은 우리가 예상했듯이 0이 됩니다. 이와 마찬가지로 13-4 역시 13+(-4)로 처리되어 9로 연산이 됩니다.

    8비트에서 표현되는 정수는 +127(01111111)~-128(10000000)입니다. 가장 왼쪽에있는 비트가 0이면 양수, 1이면 음수가 됩니다.

     

    다시한번 2의 보수를 구하는 방법을 정리해드리면

    1. 음수의 절댓값에 대한 2진수를 구한다.

    2. 1.의 결과에서 각 비트를 반전하여 1의 보수를 구한다.

    3. 2.의 결과에 1을 더한다.

    하면 3.의 결과가 바로 2의 보수가 되는 것입니다.

     

    마지막으로 실수의 표현입니다. 실수란 소숫점이 표현된 숫자를 말하며 부동소숫값(Floating point number)이라고도 합니다. 여기서 주목할 점은 '부동'이라는 표현 영어로는 'Floating'이라는 표현입니다. 부동이라는 한자어가 익숙하지 않을 수도 있지만 Float라는 단어는 익숙하실 겁니다. 바로 '(물 위에)뜨다' 라는 의미로 사용되는 단어입니다. 그러면 왜 소수를 나타내는데 이런 표현을 사용했을까요? 그건 바로 실제로 컴퓨터에서 실수를 표현할 때 상용로그(log)처럼 가수부와 지수부를 나누어놓고 가수부에 나온 숫자패턴에 지수부의 수를 곱해서 자릿수만 바꿔주기 때문입니다.



    이것처럼 말이죠. 마치 부표가 물위를 떠다니는 것과같이 소숫점의 위치만 이동해서 그 값을 정해주게 됩니다. 그래서 '부동'소수라는 이름이 붙은 거라고 합니다.

    가수부와 소수부를 나누는 것은 4바이트(32비트)에서와 8바이트(64비트)일 때가 서로 다릅니다. 또한 그 값은 가수*지수의 값으로 너무 작은 소수로 가면 정확하지 않을 수도 있습니다.

    실수에 대해선 여기까지만 설명하도록 하겠습니다. 좀 더 정확하고 안전한 프로그래밍을 위해서는 그 유효한 범위까지 알고있는게 좋겠지만 그것에 대해선 추후 자세히 설명하도록 하겠습니다.

     

     

     

    다음으로 상수의 표현에대해 설명하겠습니다.

    상수(constant)란 프로그램에서 자료의 값을 나타내는 데 사용하는 숫자나 문자로 프로그램이 실행되는 도중에 값이 변경될 수 없는 수를 말합니다. 상수에는 문자상수, 정수상수, 실수상수, 문자열상수가 있습니다. C++에서는 아니지만 C에선 문자상수가 정수취급(4바이트)로 처리가 됩니다. 이에대한 내용은 C++과 C의 차이이므로 생략하고 따로 글 올리겠습니다.

    문자상수는 단일 인용부호(' ')로 싸여있고 반드시 하나의 문자만을 써야합니다. 예를들어 'ABC'처럼 2개 이상의 문자가 들어갈 경우 에러가 발생합니다. 문자상수를 표현할 때 들어갈 수 있는것은 '\n' 또는 '\t'처럼 엔터 또는 탭을 사용할 수 있습니다. 이런 것을 이스케이프문자, 또는 탈출 문자라고 합니다.

    Colored By Color Scripter

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <stdio.h>
     
    int main ()
    {
        printf("%c\n"'a');
        printf("%c\n", 97);
        printf("%c\n"'\141');
        printf("%c\n"'\x61');
        
        printf("삐음 : %c\n"'\a');
        printf("단일 인용부호 : %c\n"'\'');
        printf("abcdef\b\b\b\b");
        printf("%s\n""ghijk");
     
        return 0;
     
     

    이 프로그램은 문자와, 이스케이프문자, 그리고 문자열에 대해 간단히 알 수 있는 프로그램입니다. 직접 실행시켜보시면 이해를 돕는데 좋을겁니다.
    정수상수는 숫자만 입력할 경우 10진수, 0숫자는 8진수, 0x숫자는 16진수로 표현됩니다. 
    10진수로 12를 표현할 경우
    10진수 : 10
    8진수 : 014
    16진수 : 0xc
    로 표현합니다.
    실수형 상수의 경우 소수로 표기하는 방법과 지수로 표기하는 방법이 있습니다.
    소수 표기법 : 1.25, 4.25f, 0.801 // 4.25f에서 f는 double 형이 아닌 float형 실수란 의미입니다. 자료형 설명할 때 배울 내용입니다.
    지수 표기법 : 0.125e1, 0.516e+2, 31.4e-1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    int main ()
    {
        printf("%d %d\n"sizeof 3.14f, sizeof 3.14);
        printf("%lf %lf\n", 0.314e1, 31.4e-1);
        printf("%lf\n", 0.12345678901234567890);
        printf("%.20lf\n", 0.12345678901234567890);
        printf("%.20f\n", 0.12345678901234567890f);
     
        return 0;
     
     

    이 프로그램은 실수형 상수에대해 설명하기 위한 프로그램입니다. 직접 실행시켜보세요.
     
    이상으로 상수편 마치겠습니다.


    'Legacy > C' 카테고리의 다른 글

    0x03 입력과 출력 - 출력  (0) 2014.12.14
    0x02 변수와 자료형  (0) 2014.12.14
    [참고] 아스키코드표  (0) 2014.12.14
    0x00 C강의시작&C언어란?  (0) 2014.12.14
Designed by Tistory.