티스토리 뷰

반응형

이것이 C언어다: Chapter 04~05 정리


Chapter 04. 데이터 표현방식의 이해

04-1. 컴퓨터가 데이터를 표현하는 방식

  • 컴퓨터는 0과 1(비트, bit) 만을 이해합니다.
  • 8비트 = 1바이트(byte) 가 기본 단위
  • 따라서 모든 정수, 문자, 실수는 이진수로 저장됨

예시:

  • int a = 5; → 메모리 안에는 00000101(2진수)
  • char c = 'A'; → ASCII 코드 65 → 01000001

진수 표현 방법:

int a = 10;     // 10진수
int b = 0b1010; // 2진수 (C99 이상)
int c = 012;    // 8진수
int d = 0xA;    // 16진수

출력 형식 지정자:

printf("%d %o %x\n", 10, 10, 10);  // 10 12 a
printf("%X\n", 255);              // FF

04-2. 정수와 실수의 표현식

  1. 정수 표현
  • 부호 있는 정수는 2의 보수 방식 사용
  • 예: 8비트에서 -5 = 11111011
  • 장점: 뺄셈을 덧셈으로 처리 가능, 회로 단순화
  1. 실수 표현
  • IEEE 754 표준 부동소수점
  • float: 4바이트(32비트), 약 7자리 유효숫자
  • double: 8바이트(64비트), 약 15~16자리 유효숫자

구조: 부호비트(1) + 지수부 + 가수부

작은 팁 ✅

  • 실수 연산에서는 오차가 생길 수 있음
  • 0.1 + 0.2 == 0.3 은 거짓일 수 있다!
  • → 실수 비교는 fabs(a-b) < 1e-9 같은 방법 사용
#include <stdio.h>
#include <math.h>
int main(void) {
    double a = 0.1 + 0.2;
    if (fabs(a - 0.3) < 1e-9)
        printf("거의 같다!\n");
    else
        printf("다르다!\n");
    return 0;
}

04-3. 비트 연산자

정수의 이진 표현을 직접 다루는 연산자:

  • & 비트 AND
  • | 비트 OR
  • ^ 비트 XOR
  • ~ 비트 NOT
  • << 왼쪽 시프트
  • >> 오른쪽 시프트

예시:

int a = 6;   // 00000110
int b = 3;   // 00000011
printf("%d\n", a & b);  // 2 (00000010)
printf("%d\n", a | b);  // 7 (00000111)
printf("%d\n", a ^ b);  // 5 (00000101)
printf("%d\n", a << 1); // 12 (00001100)
printf("%d\n", a >> 1); // 3 (00000011)

활용:

  • 비트 마스크(특정 비트만 켜거나 끄기)
  • 속도 빠른 곱셈/나눗셈 (x << 1 ≈ x*2)
  • 플래그 관리(옵션 On/Off)

Chapter 05. 상수와 기본 자료형

05-1. C 언어가 제공하는 기본 자료형

  • int (정수, 보통 4바이트)
  • char (문자, 1바이트)
  • float (단정도 실수, 4바이트)
  • double (배정도 실수, 8바이트)
  • short, long, long long
  • unsigned (음수 없이 범위 확장)

크기 확인:

#include <stdio.h>
int main(void) {
    printf("int: %zu바이트\n", sizeof(int));
    printf("char: %zu바이트\n", sizeof(char));
    printf("double: %zu바이트\n", sizeof(double));
    return 0;
}

05-2. 문자와 표현방식, 문자열과 자료형

  1. 문자
  • 작은따옴표 'A'
  • 실제로는 char 타입 숫자 65 저장
  1. 문자열
  • 큰따옴표 "Hello"
  • 내부적으로는 char 배열 + \0 (널 문자)
  • "Hello"는 사실 {'H','e','l','l','o','\0'}

예시:

char c = 'A';
char str[] = "Hello";

printf("%c %d\n", c, c);    // A 65
printf("%s\n", str);        // Hello

05-3. 상수에 대한 이해

상수 종류:

  • 리터럴 상수: 10, 3.14, 'A', "Hi"
  • 심볼릭 상수: #define PI 3.14
  • const 상수: const int MAX = 100;

#define vs const

  • #define은 전처리기 치환 (타입 없음)
  • const는 타입을 가지며 디버깅에 유리
  • 최근 코드에서는 const 선호
#define PI 3.14159
const double pi = 3.14159;

int main(void) {
    printf("%f %f\n", PI, pi);
    return 0;
}

작은 연습 문제 ✍️

  1. 정수 1234를 2진수, 8진수, 16진수로 출력해보세요.
  2. 비트 연산을 이용해 정수의 짝수/홀수 판별 프로그램을 짜 보세요.
    • 힌트: n & 1 결과가 0이면 짝수
  3. 섭씨-화씨 변환을 const 상수를 이용해 짜 보세요.
    • 공식: F = C * 9 / 5 + 32
  4. 문자열 "Hello" 의 길이를 직접 반복문으로 세어 보세요.

핵심 정리 ✅

  • 데이터는 모두 이진수로 저장된다
  • 정수는 2의 보수, 실수는 IEEE 754 부동소수점
  • 비트 연산은 빠르고 메모리 절약적인 저수준 기술
  • C의 기본 자료형은 int, char, float, double 중심
  • 문자열은 char 배열이며 마지막에 \0 포함
  • 상수는 #define보다 const 사용이 현대적이고 안전

 

반응형