ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C] 간단한 개념 정리 (Chapter 05)
    [C언어] 2023. 10. 5. 19:02

    상수와 기본 자료형

     
    자료형은 데이터를 표현하는 방법이다.
     
     

    기본 자료형의 종류와 데이터의 표현범위

     
    정수형 
    char : 1바이트 / short : 2바이트 / int : 4바이트 / long : 8바이트 / long long : 8바이트 /
     
    실수형
    float : 4바이트 / double : 8바이트 / long double : 8바이트 이상
     

    #include <stdio.h>

    int main(void) {
    char ch = 9;
    int inum = 1052;
    double dnum = 3.1415;
    printf("변수 ch의 크기 : %d \n", sizeof(ch));
    printf("변수 inum의 크기 : %d \n", sizeof(inum));
    printf("변수 dnum의 크기 : %d \n", sizeof(dnum));
     
    printf("char의 크기 : %d \n", sizeof(char));
    printf("int의 크기 : %d \n", sizeof(int));
    printf("long의 크기 : %d \n", sizeof(long));
    printf("long long의 크기 : %d \n", sizeof(long long));
    printf("float의 크기 : %d \n", sizeof(float));
    printf("double의 크기 : %d \n", sizeof(double));

    return 0;
    }

    <실행결과>
    변수 ch의 크기 : 1 
    변수 inum의 크기 : 4 
    변수 dnum의 크기 : 8 
    char의 크기 : 1 
    int의 크기 : 4 
    long의 크기 : 8 
    long long의 크기 : 8 
    float의 크기 : 4 
    double의 크기 : 8
     

    정수 표현 및 처리하기 위한 일반적인 자료형의 선택
     

    => 일반적으로 CPU 가 처리하기에 가장 적합한 크기의 정수 자료형을 Int 로 정의한다.
          따라서 int 형 연산의 속도가 다른 자료형의 연산속도에 비해서 동일하거나 더 빠르다.
     
    char 형 변수와 short 형 변수는?
    : "데이터의 양이 많아서 연산속도보다 데이터의 크기를 줄이는 것이 더 중요한 데이터들" 일 때 사용.
     
     

    실수를 표현 및 처리하기 위한 일반적인 자료형의 선택
     

    실수 자료형의 선택에 있어서 가장 중요한 요소는 "정밀도"

     

    실수 자료형 소수점 이하 정밀도 바이트 수
    float 6자리 4
    double 15자리 8
    long double 18자리 12

     
    정수 자료형과 같이 실수 자료형에서도 보편적으로 선택하는 자료형이 있는데 , 
    double 형이 바로 그것이다.
     
    예전에는 float 이었지만 정밀도가 너무 낮아 float 보다 정밀도가 높으면서도 long double 보다는 부담이 덜 되는 double 이 보편적으로 선택하는 자료형이 되었다.
     
     

    unsigned 를 붙여서 0과 양의 정수로만 표현하게 할 수 있다.
     

    정수 자료형의 이름에 한해서 unsigned 선언을 추가하면, 0 이상의 값만 표현하는 자료형이 되어서, 표현할 수 있는 값의 범위가 양의 정수 방향으로 두 배 더 넓어지게 됨.
     

    • 정수 자료형의 이름 앞에만 unsigned 를 붙일 수 있다.
    • unsigned 가 붙으면, MSB 도 데이터의 크기를 표현하는 데 사용이 된다.
    • 따라서 표현할 수 있는 값이 0 이상의 범위로 두 배가 된다.

    그러나 이 키워드를 붙인다고 해서 의미가 달라지는 것은 아님.

     
     

    문자의 표현방식
     

    프로그램상에서의 문자표현에는 작은 따옴표가 사용됨.
     

    #include <stdio.h>

    int main(void) {

    char ch1 = 'A', ch2 = 65;
    int ch3 = 'Z', ch4 = 90;

    printf("%c %d \n", ch1, ch1);
    printf("%c %d \n", ch2, ch2);
    printf("%c %d \n", ch3, ch3);
    printf("%c %d \n", ch4, ch4);

    return 0;
     
    }

    <실행결과>
    A 65
    A 65
    Z 90
    Z 90
     
    %c 의 의미 : "문자의 형태로 데이터를 출력 (또는 입력) 하라."
     
    => " 정수는 출력의 방법에 따라서 문자의 형태로도, 숫자의 형태로도 출력이 가능하다. "
     
     

    상수

     
    상수 : 변경이 불가능한 데이터. = 변수의 상대적 개념. 
     
    상수는 크게 ' 이름이 있는 상수 ' 와 ' 이름이 없는 상수 ' 로 나뉨.
    상수 역시 앞서 설명한 int, double 과 같은 자료형을 근거로 표현이 된다.
     
     

    이름을 지니지 않는 리터럴 (Literal) 상수
     

    int num = 30 + 40;
     
    위의 코드는 30과 40의 합의 결과를 변수 num 에 저장하는 코드이다.
    덧셈이 우선 진행되고, 그 결과로 얻어진 결과값으로 변수 num 을 초기화하게 된다.
     
    그렇다는 것은 30 + 40 의 연산을 CPU 가 진행해야 한다는 뜻인데, 그러기 위해서는 30 과 40이 메모리상에 존재해야
    CPU 의 연산대상이 될 수 있다. 
     
    CPU 의 덧셈 과정은 
     

    • 단계 1 : 정수 30과 메모리 공간에 상수의 형태로 저장된다.
    • 단계 2 : 두 상수를 기반으로 덧셈이 진행된다.
    • 단계 3 : 덧셈의 결과로 얻어진 정수 70이 변수 num 에 저장된다.

    => 상수의 특징 : 변수 num 과 달리 할당된 메모리 공간에 이름이 없다.
    이렇게 이름이 없는 상수를 가리켜 ' 리터럴 (Literal) 상수 또는 그냥 리터럴 (Literal) ' 이라 한다.
     
     

    리터럴 상수의 자료형
     
     

    상수를 메모리 공간에 저장하기 위한 고민
    " 실수의 형태로 저장해야 할까? 아님 정수의 형태로 저장해야 할까? "
    " 몇 바이트 크기로 저장해야 할까? "
     
    위의 두 가지 표현을 줄여
     
    " 어떠한 자료형으로 저장해야 할까? "
     
    => 메모리상에 저장되는 모든 데이터는 자료형이 결정되어야 함. 그래야 저장하는 방법이 명확해지기 때문.
     
    int inum = 5; // 정수형 상수
    double dnum = 7.15; // 실수형 상수
     
    위의 코드에서는 상수 5 가 int 형에, 상수 7.15 는 double 형에 저장되어 있다.
     
    int 형으로 표현 가능한 정수형 상수는 int 형으로 메모리 공간에 저장하기로 약속되어 있고
    double 형으로 표현 가능한 실수형 상수는 double 형으로 메모리 공간에 저장하기로 약속되어 있다.
     
     

    이름을 지니는 심볼릭 (Symbolic) 상수 : const 상수
     

    심볼릭 상수를 표현하는 두 가지 방법

    • const 키워드를 사용하는 방법
    • 메크로를 이용하는 방법

     
    const 키워드를 사용하는 방법

    #include <stdio.h>

    int main(void) {

    const int MAX = 100; // MAX 는 상수 이므로 값의 변경 불가.
    const double PI = 3.1415; // PI 는 상수 이므로 값의 변경 불가.

    return 0;
    }

    상수가 이름을 지니고 있다. => 심볼릭 상수
    상수의 일종이므로, 한번 초기화되면 그 값을 변경시킬 수 없음. 뿐만 아니라 선언과 초기화를 분리시킬 수도 없음.
     
    + 상수의 이름은 모두 대문자로 표시하고, 둘 이상의 단어로 연결할 때에는 MY_AGE 와 같이 언더바를 이용해서 두 단어를 구분하는 것이  관례이다.
     
     

    자료형의 변환

     
    char 형 -> int 형 / int 형 -> double 형
     
    자료형의 변환 : 데이터의 표현방식을 바꾸는 것.
     
    형변환 종류

    • 자동 형 변환 (묵시적) => 형 변환이 자동으로 발생
    • 강제 형 변환 (명시적) => 강제로 변환을 발생시킴

     

     
    대입연산의 전달과정에서 발생하는 자동 형 변환

     
    대입 연산자의 왼편과 오른편에 존재하는 두 피연산자의 자료형이 일치하지 않으면, 왼편에 있는 피연산자를 대상으로 형 변환이 자동으로 일어남.
     
    대표적인 형 변환

    • 정수를 실수로 형 변환하는 경우

    => 데이터의 손실은 일어나지 않지만 실수의 표현이기 때문에 오차 존재.

    • 실수를 정수로 형 변환하는 경우

    => 소수점 이하의 값은 버려짐.

    • 바이트 크기가 큰 정수를 바이트 크기가 작은 정수로 형 변환하는 경우

    => 변환하고자 하는 정수의 바이트 크기에 맞춰 상위 바이트를 단순히 소멸. (부호가 바뀔 수 있음.)

     

    (ex)

     
    double num1 = 245; // int 형 정수 245를 double 형으로 자동 형 변환
     
    int num2 = 3.1415; // double 형 실수 3.1415 를 int 형으로 자동 형 변환
            => 실수형 데이터를 정수형 데이터로 변환하는 과정에는 ' 소수부분의 손실 ' 이 발생함.
     
    int num3 = 129;
    char ch = num3;
     
    <결과>
    num3 의 129를 비트 열로 나타냈을 때
    00000000 00000000 00000000 10000001
     
    이 데이터를 변수 ch 에 저장하기 위해서는 1바이트 크기로 줄여야됨. => ' 상위 바이트의 손실 ' 이 발생.
    => 10000001 // 이는 정수로 -127
     
     

    정수의 승격 (Integral Promotion) 에  의한 자동 형 변환
     

     
    "일반적으로 CPU 가 처리하기에 가장 적합한 크기의 정수 자료형을 int 로 정의. 따라서 int 형 연산의 속도가 다른 자료형의 연산속도에 비해서 동일하거나 더 빠름."
     

    (ex)

     
    short num1 = 15, num2 = 25;
    short num3 = num1 + num2; // num1 과 num2 가 int 형으로 형 변환.
     
     
     

    피연산자의 자료형 불일치로 발생하는 자동 형 변환
     
     

    피연산자의 자료형이 일치하지 않아서 발생하는 자동 형 변환은 데이터의 손실을 최소화하는 방향으로 진행.
     

    (ex)
     

    double num1 = 5.15 + 19; // 24.15
     
    데이터 손실의 최소화 기준
    int > long > long long > float > double > long double
     
    + 형 변환의 우선순위는 정수 자료형보다 실수 자료형이 무조건 앞서는 형태로 정의.
     
     

    명시적 형 변환 : 강제로 일으키는 형 변환

     

    #include <stdio.h>

    int main(void) {

    int num1 = 3, num2 = 4;
    double divResult;
    divResult = num1 / num2;
    printf ("나눗셈 결과 : %f \n", divResult);
     
    return 0;
    }

    <결과>
    나눗셈 : 0.000000 => 연산결과의 자료형은 파연산자의 자료형과 일치.
     

    #include <stdio.h>

    int main(void) {

    int num1 = 3, num2 = 4;
    double divResult;
    divResult = (double)num1 / num2;
    printf ("나눗셈 결과 : %f \n", divResult);
     
    return 0;
    }

    <결과>
    나눗셈 : 0.750000
     
    위에서 사용된 소괄호가 ' 형 변환 연산자 (type casting operator) '  라 함.
     

Designed by Tistory.