[KOCW 한국산업기술대학교 박정민 교수님] C 프로그래밍 6강

MinWoo Park·2021년 8월 20일
0

KOCW

목록 보기
6/19
post-thumbnail

Part6 자료형이란 무엇인가


6.1 자료형이란

자료형

  • 변수가 저장하는 데이터 형식

자료형의 종류

  • 정수형: char(1Byte), short(2Byte), int(4Byte), long(최소 4Byte, 운영체제 Bit마다 다름)
  • 실수형: float(4Byte), double(8Byte), long double(8Byte)

자료형의 크기

  • sizeof(자료형 or 변수): 자료형에 할당되는 메모리의 크기를 구할 수 있음

6.2 정수형

정수형의 종류

  • char: 1Byte(-128 ~ 127 표현 가능)
  • short: 2Byte(-32768 ~ 32767)
  • int: 4Byte(-2147483648 ~ 2147483647)
  • long: 4Byte(-2147483648 ~ 2147483647)
  • 데이터의 표현 범위: -2ⁿ⁻¹ ~ 2ⁿ⁻¹-1 (범위가 음수, 양수로 나뉘니까 -1은 0을 포함하기 때문)
  • limits.h: 정수형 데이터 표현 최솟값, 최댓값 상수 제공
  • 양 범위를 두 배로 늘리는 unsigned 자료형 있음
    ex) char(signed char) 대신 unsigned char를 사용, 표현 범위는 0 ~ (127 + 128)

정수형은 int형을 선호한다

  • CPU가 int형을 가장 빠르게 처리하기 때문인데, CPU가 연산하는 기본 단위가 최소 32Bit이다.
  • char는 1바이트이기에 int형 4바이트로 변환해서 연산을 수행함.
    중간에 한 단계가 생겨 느릴 수 밖에 없다.

정수형의 overflow, underflow는 순환된 값을 출력한다

  • overflow: 자료형에 저장할 수 있는 최대 범위보다 큰 수 저장
  • underflow: 자료형에 저장할 수 있는 최소 범위보다 작은 수 저장

ex)

#include <stdio.h>
int main(void)
{
    char num1 = -129; // 최솟값(-128)보다 -1만큼 작은 값 => underflow
    char num2 = 128; // 최댓값(127)보다 +1만큼 큰 값 => overflow

    printf("%d \n", num1); 
    printf("%d \n", num2);

    num1 = -130;
    num2 = 129;

    printf("%d \n", num1);
    printf("%d \n", num2);

    return 0;
}

// 127 
// -128 
// 126 
// -127 

6.3 실수형

실수형이란

  • 소수점을 가진 실수의 값을 표현할 수 있는 자료형
  • float: 4Byte
  • double: 8Byte
  • long double: 8Byte(컴파일러마다 다름)
  • float.h: 실수형 데이터 표현 범위를 자동으로 알려주는 라이브러리
    ex)
#include <stdio.h>
#include <float.h>
int main(void)
{
    printf("Float's minimum %e, maximum %e \n", FLT_MIN, FLT_MAX);
    printf("Double's minimum %e, maximum %e \n", DBL_MIN, DBL_MAX);
    printf("Long's minimum %e, maximum %e \n", LDBL_MIN, LDBL_MAX);

    return 0;
}

// Float's minimum 1.175494e-38, maximum 3.402823e+38 
// Double's minimum 2.225074e-308, maximum 1.797693e+308 
// Long's minimum 2.225074e-308, maximum 1.797693e+308 
  • float형의 오차 문제를 해결하기 위해 double형을 주로 사용
    ex)
#include <stdio.h>
int main(void)
{
    float num1 = 3.4e+30; // 3.4x10의 30승
    double num2 = 3.4e+30;

    printf("%f, %e, \n", num1, num1); // %f는 고정 소수점, %e는 부동 소수점 출력
    printf("%lf, %le, \n", num2, num2);

    return 0;
}

// 3399999900045657695752095268864.000000, 3.400000e+30, // float형 오차 발생 
// 3400000000000000236492710477824.000000, 3.400000e+30, // double형은 정상

실수형은 데이터의 정밀도를 높이기 위해 사용한다

  • float: 소수점 이하 6자리
  • double: 소수점 이하 15자리
  • long double: 소수점 이하 15자리 또는 그 이상

실수형은 double형을 선호한다

  • float에 비해 오차를 줄일 수 있고 정밀도를 높일 수 있기 때문.
    그래서 컴파일러는 기본적으로 실수형을 double로 인식
    ex)
#include <stdio.h>
int main(void)
{
    float num1 = 0.123456789012345;
    double num2 = 0.123456789012345;

    printf("float %f \n", num1);
    printf("double %lf \n", num2);

    printf("float %.15f \n", num1);
    printf("double %.15lf \n", num2);

    return 0;
}

// float 0.123457 // 소수점 6자리까지 표현 가능. 7자리에서 반올림
// double 0.123457 // 특정 길이 지정 없으면 기본 6자리
// float 0.123456791043282 // 6자리 초과부터 오차 발생
// double 0.123456789012345 // 오차없이 출력

6.4 문자형

CPU는 문자를 인식하지 못함

  • 숫자를 문자와 연결해서 인식하기 위해 문자 표현에 대한 표준을 정한 것이 ASCII 코드
  • 문자형은 정수형 중 하나로 분류됨. 이유는 숫자 0~127까지 문자가 연결되어 있음

문자형은 char형을 선호한다

  • 작은따옴표 안에 문자 하나를 입력(ASCII에 지정된 숫자, 문자만 저장)
  • 문자가 변수에 저장될 때는 먼저 ASCII 코드 값을 참조해서 저장하게 됨

6.5 자료형 변환

컴파일러가 자동으로 형변환을 해준다 - 자동 형변환

  • 다른 자료형 간에 산술 연산을 하는 경우
    피연산자의 자료형은 정밀도가 작은 자료형이 큰 자료형으로 변환됨.
    ex)
#include <stdio.h>
int main(void)
{
    int num1 = 100;
    double num2 = 3.14;

    printf("%lf \n", num1 + num2); // 정수 + 실수, 정수를 double형으로 변환해서 실수 + 실수로 연산을 수행함
    return 0;
}

// 103.140000 
  • 대입 연산의 경우 대입 연산자 기준으로 오른쪽에서 왼쪽으로 자동 형변환
    자동 형변환에서 유의할 점은 의도하지 않은 형 변환 때문에 발생하게 되는 데이터 손실을 이해해야 함
    ex)
#include <stdio.h>
int main(void)
{
    char num1 = 130; // 대입 연산자 기준으로 오른쪽(130)에서 왼쪽 num1(char)으로 자동 형변환, 오버플로우 발생
    int num2 = 3.14; // 0.14만큼 데이터 손실
    double num3 = 3; // 작은 형에서 큰 형으로 변환되어 데이터 손실 없음

    printf("%d, %d, %lf \n", num1, num2, num3);

    return 0;
}

// -126, 3, 3.000000 

프로그래머가 강제로 형변환을 해준다 - 강제 형변환

  • 데이터 손실이 있는 경우, 데이터 손실을 최소화할 수 있음
  • 이미 정의된 자료형을 강제적으로 다른 자로형으로 변환
  • 괄호 연산자 ()를 이용
    ex)
#include <stdio.h>
int main(void)
{
    int num1 = 10;
    int num2 = 3;

    double result;

    // 정수 / 정수
    result = num1 / num2;
    printf("result: %lf \n", result);

    // 실수 / 정수
    result = (double)num1 / num2;
    printf("result: %lf \n", result);

    // 정수 / 실수
    result = num1 / (double)num2;
    printf("result: %lf \n", result);

    // 실수 / 실수
    result = (double)num1 / (double)num2;
    printf("result: %lf \n", result);

    return 0;
}

// result: 3.000000 
// result: 3.333333 
// result: 3.333333 
// result: 3.333333 

6.6 typedef를 이용한 자료형의 재정의

  • 기본 자료형들에 새로운 이름을 붙이는 용도
  • typedef [기본 자료형][사용자 정의 자료형]
    ex)
#include <stdio.h>
typedef int good;
good main(void)
{
    good num1 = 3000;
    good num2 = 10000;
    good num3 = 2000;
    good num4 = 0;

    num4 = num1 + num2 + num3;
    printf("total good: %d \n", num4);

    return 0;
}

// total good: 15000

Reference
강의: 박정민, 『C 프로그래밍』, KOCW 한국산업기술대학교, 6강
교재: 박정민, 『열혈강의 C 언어 본색 명강의가 일으키는 C 언어 기적』, 프리렉 (2011), p131-164.

profile
물음표를 느낌표로 바꾸는 순간을 사랑하는 개발자입니다.

0개의 댓글