C/Chapter03. 데이터형(sizeof)

lullaby ·2025년 10월 1일

C언어

목록 보기
3/10
post-thumbnail

1. 데이터형과 변수 핵심 개념

1.1 자료형의 개념

  • 자료형(데이터형): 컴퓨터 시스템에서 값을 2진 데이터로 표현하고 저장하는 방식
  • sizeof 연산자: 데이터형이나 변수의 바이트 크기를 구함
    • 플랫폼에 따라 크기가 다를 수 있음

1.2 C의 기본 자료형

  • 문자형: char (1바이트)
  • 정수형: short (2바이트), int (4바이트), long (4바이트), long long (8바이트, C99)
  • 실수형: float (4바이트), double (8바이트)
  • 부호 여부: signed(기본값), unsigned

1.3 정수형

  • 크기 관계: sizeof(short) ≤ sizeof(int) ≤ sizeof(long)
  • 표현 범위:
    • char: -128~127 (unsigned: 0~255)
    • short: -32768~32767 (unsigned: 0~65535)
    • int: -2147483648~2147483647 (unsigned: 0~4294967295)
  • 2의 보수: 부호 있는 정수형에서 음수 표현 방법
  • 정수형 승격: char, short형 변수는 사용 시 int형으로 변환

1.4 문자형

  • ASCII 코드를 사용하여 문자 표현 (예: 'A'는 65)
  • 특수 문자(이스케이프 시퀀스):
    • \n (줄바꿈), \0 (널 문자), \t (수평 탭), " (큰따옴표), \ (역슬래시)

1.5 실수형

  • 표현 방식: 부동소수점 방식
  • 정밀도:
    • float (단정도): 소수점 이하 6자리까지 정확
    • double (배정도): 소수점 이하 15자리까지 정확

1.6 변수와 상수

  • 변수: 값을 변경할 수 있는 데이터
    • 선언: 데이터형 + 변수명 (예: int age;)
    • 초기화: 선언과 동시에 값 할당 (예: int age = 25;)
  • 상수: 값을 변경할 수 없는 데이터
    • 리터럴 상수: 값 자체 (예: 'A', 123, 3.14)
    • 매크로 상수: #define으로 정의 (예: #define PI 3.14)
    • const 변수: const 키워드로 정의 (예: const int MAX = 100;)

2. 예제 코드 정리

2.1 sizeof 연산자 사용

#include <stdio.h>

int main() {
    printf("char: %d bytes\n", sizeof(char));
    printf("short: %d bytes\n", sizeof(short));
    printf("int: %d bytes\n", sizeof(int));
    printf("long: %d bytes\n", sizeof(long));
    printf("float: %d bytes\n", sizeof(float));
    printf("double: %d bytes\n", sizeof(double));

    int num = 10;
    printf("변수 num의 크기: %d bytes\n", sizeof(num));

    return 0;
}

2.2 정수형 오버플로우/언더플로우

#include <stdio.h>

int main() {
    unsigned char a = 255;
    printf("a = %d\n", a);  // 255 출력

    a = a + 1;              // 오버플로우 발생
    printf("a + 1 = %d\n", a);  // 0 출력

    char b = 127;
    printf("b = %d\n", b);  // 127 출력

    b = b + 1;              // 오버플로우 발생
    printf("b + 1 = %d\n", b);  // -128 출력

    return 0;
}

2.3 문자형과 ASCII 코드

#include <stdio.h>

int main() {
    char c = 'A';
    printf("문자: %c\n", c);                // A 출력
    printf("ASCII 코드(10진수): %d\n", c);  // 65 출력
    printf("ASCII 코드(16진수): %x\n", c);  // 41 출력

    c = c + 1;  // 'B'로 변경
    printf("다음 문자: %c\n", c);           // B 출력

    return 0;
}

2.4 이스케이프 시퀀스

#include <stdio.h>

int main() {
    printf("Hello\nWorld\n");        // 줄바꿈
    printf("Tab\tCharacter\n");      // 탭
    printf("\"Quoted String\"\n");   // 큰따옴표
    printf("Backslash: \\\n");       // 역슬래시

    return 0;
}

2.5 실수형 정밀도 비교

#include <stdio.h>

int main() {
    float f = 123.456789;
    double d = 123.456789;

    printf("float: %.15f\n", f);    // 정밀도 손실 발생
    printf("double: %.15f\n", d);   // 더 정확한 값 유지

    return 0;
}

2.6 변수 선언과 초기화

#include <stdio.h>

int main() {
    int a;              // 초기화되지 않은 변수
    int b = 10;         // 초기화된 변수

    printf("a = %d\n", a);    // 쓰레기 값 출력
    printf("b = %d\n", b);    // 10 출력

    a = 20;             // 값 할당
    printf("a = %d\n", a);    // 20 출력

    return 0;
}

2.7 상수 사용 예제

#include <stdio.h>
#define PI 3.14159    // 매크로 상수

int main() {
    const int MAX = 100;   // const 변수

    printf("원주율: %f\n", PI);
    printf("최대값: %d\n", MAX);

    // MAX = 200;    // 오류: const 변수는 변경 불가

    return 0;
}

3. 예상 문제 및 풀이

문제 1: 기본 개념

문제: 다음 C 데이터 타입의 크기를 바이트 단위로 맞추세요.

  • char
  • int
  • float
  • double

:

  • char: 1바이트
  • int: 4바이트
  • float: 4바이트
  • double: 8바이트

문제 2: 정수형 오버플로우

문제: 다음 코드의 출력 결과는?

#include <stdio.h>

int main() {
    unsigned char x = 255;
    x++;
    printf("%d", x);
    return 0;
}

: 0 (255에 1을 더하면 오버플로우가 발생하여 0이 됨)

문제 3: 문자형과 정수형 변환

문제: 다음 코드의 출력 결과는?

#include <stdio.h>

int main() {
    char c = 'A';
    printf("%d %c\n", c, c + 32);
    return 0;
}

: 65 a (A의 ASCII 코드는 65, 소문자 a는 A에 32를 더한 값)

문제 4: 변수 초기화

문제: 다음 중 올바른 변수 초기화 방법은?

  1. int x;
  2. int x = 10;
  3. x = 10; int x;
  4. 10 = x; int x;

: 2번 (int x = 10;)

문제 5: 실수형 정밀도

문제: float와 double의 차이점에 대한 설명으로 옳지 않은 것은?

  1. float는 4바이트, double은 8바이트이다.
  2. float는 소수점 이하 6자리, double은 소수점 이하 15자리까지 정확하다.
  3. float는 double보다 메모리를 덜 사용한다.
  4. float는 double보다 항상 더 정확한 계산 결과를 제공한다.

: 4번 (double이 float보다 더 정확한 계산 결과 제공)

문제 6: 상수 정의

문제: 다음 중 매크로 상수를 정의하는 올바른 방법은?

  1. const PI = 3.14;
  2. #define PI = 3.14;
  3. #define PI 3.14
  4. define PI 3.14;

: 3번 (#define PI 3.14)

문제 7: 코드 결과 예측

문제: 다음 코드의 출력 결과는?

#include <stdio.h>
#define MAX 100

int main() {
    const int num = 50;
    printf("%d %d\n", MAX, num);
    // MAX = 200;  // 주석 처리됨
    // num = 100;  // 주석 처리됨
    return 0;
}

: 100 50 (MAX는 전처리기에 의해 100으로 대체, num은 const 변수로 50 값을 가짐)

문제 8: 코드 완성

문제: 다음 코드를 완성하여 int, float, char 타입의 크기를 출력하는 프로그램을 작성하세요.

#include <stdio.h>

int main() {
    // 여기에 코드 작성
    return 0;
}

:

#include <stdio.h>

int main() {
    printf("int 크기: %d 바이트\n", sizeof(int));
    printf("float 크기: %d 바이트\n", sizeof(float));
    printf("char 크기: %d 바이트\n", sizeof(char));
    return 0;
}

문제 9: 이스케이프 시퀀스

문제: 다음 출력 결과를 얻기 위한 printf 문을 작성하세요.

이름: "홍길동"
학번: 20230001
성적: A+

:

printf("이름: \"홍길동\"\n학번: 20230001\n성적: A+\n");

문제 10: 코드 오류 찾기

문제: 다음 코드에서 오류를 찾고 수정하세요.

#include <stdio.h>
#define PI = 3.14;

int main() {
    const int MAX;
    MAX = 100;
    printf("PI = %f, MAX = %d\n", PI, MAX);
    return 0;
}

:

  • #define PI = 3.14; → #define PI 3.14 (매크로 상수는 = 기호와 세미콜론 불필요)
  • const int MAX; → const int MAX = 100; (const 변수는 선언 시 초기화 필요, 나중에 값 할당 불가)

4. 실전 대비 종합 문제

종합 문제 1: 여러 데이터형 사용

문제: 다음 요구사항을 충족하는 프로그램을 작성하세요.

  1. int, float, char 타입의 변수를 선언하고 초기화
  2. 각 변수의 값과 크기(바이트)를 출력
  3. int형 변수에 1을 더한 결과 출력
  4. char형 변수에 1을 더한 결과(문자와 ASCII 코드) 출력

:

#include <stdio.h>

int main() {
    int num = 10;
    float fnum = 3.14;
    char ch = 'A';

    printf("정수값: %d (크기: %d바이트)\n", num, sizeof(num));
    printf("실수값: %f (크기: %d바이트)\n", fnum, sizeof(fnum));
    printf("문자값: %c (크기: %d바이트)\n", ch, sizeof(ch));

    num = num + 1;
    printf("정수 + 1: %d\n", num);

    ch = ch + 1;
    printf("문자 + 1: %c (ASCII: %d)\n", ch, ch);

    return 0;
}

종합 문제 2: 오버플로우와 타입 변환

문제: 다음 프로그램의 출력 결과를 예측하고, 왜 그런 결과가 나오는지 설명하세요.

#include <stdio.h>

int main() {
    char a = 127;
    unsigned char b = 255;

    a = a + 1;
    b = b + 1;

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

    float x = 123456.789;
    int y = x;

    printf("x = %f\n", x);
    printf("y = %d\n", y);

    return 0;
}

:

a = -128
b = 0
x = 123456.789062
y = 123456

설명:

  • a는 char형(signed)으로 127이 최대값이며, 1을 더하면 오버플로우가 발생하여 -128이 됨
  • b는 unsigned char형으로 255가 최대값이며, 1을 더하면 오버플로우가 발생하여 0이 됨
  • x는 float형으로 실수값 저장
  • y는 x를 int형으로 변환하며 소수점 이하가 버려짐

종합 문제 3: 상수와 변수 활용

문제: 원의 반지름을 입력받아 원의 넓이와 둘레를 계산하는 프로그램을 작성하세요. 원주율(PI)은 3.14159로 정의하고, 적절한 상수 정의 방법을 사용하세요.

:

#include <stdio.h>
#define PI 3.14159

int main() {
    float radius;

    printf("원의 반지름을 입력하세요: ");
    scanf("%f", &radius);

    float area = PI * radius * radius;
    float circumference = 2 * PI * radius;

    printf("원의 넓이: %.2f\n", area);
    printf("원의 둘레: %.2f\n", circumference);

    return 0;
}

0개의 댓글