본문 바로가기
2학년 2학기/c언어

3장 변수와 자료형

by kkkkk1023 2024. 10. 23.

1. 변수

 

1. 변수의 정의

: 변수란, 프로그램에서 값들이 저장되는 공간을 변수라고 한다.

 

 

2. 변수의 선언

: 변수는 반드시 사용하기 전에 미리 선언을 해야한다.

자료형 변수이름 = 초기값;
int num = 0;
char alpha = 'a';

 

 

3. 변수의 명명법 ★★★

  • 알파벳 문자숫자, 밑줄 문자로 이루어진다.
  • 이름의 중간에 공백이 들어가면 안된다.
  • 첫 번째 문자는 반드시 알파벳 또는 밑줄 문자이어야한다. (숫자를 첫 번째 문자로 사용은 불가능
  • 대문자와 소문자를 구분하여 서로 다른 것으로 취급한다. 따라서, 변수 index와 Index, INDEX는 서로 다른 변수이다.
  • C언어에서 사용하고 있는 키워드(예약어)와 똑같은 이름은 허용되지 않는다.

 

4. 변수의 초기화

변수를 초기화시키지 않으면?

☞ 변수가 어디서 선언되는지에 따라 다르지만, 일반적으로 초기화되지 않은 변수에는 쓰레기 값이 들어가게 된다.

 

 


 

2. 자료형

: 자료형에는 정수형, 부동소수점형, 문자형이 있다. 

 

자료형 바이트 수
정수형 short 2
int 4
long 4
long long 8
문자형 char 1
부동 소수 점형 float 4
double 8
long double 8

 

 


3. sizeof 연산자

: 자료형의 크기를 알아보기 위해서 사용하는 것

 

int x; 
printf("변수 x의 크기: %d\n", sizeof(x)); // 변수 X의 크기: 4
printf("char의 크기: %d\n", sizeof(char)); // char의 크기: 1
printf("int의 크기: %d\n", sizeof(int)); // int의 크기: 4

 

 


 

4. unsigned

: unsigned는 변수가 음수가 아닌 값만을 나타낸다는 것을 의미한다. (0포함)

 

 

여기서 unsigned로 선언된 변수에 음수를 넣으면 실제로 저장되는 값은 2의 보수 표현에서 모든 비트가 1인 값, 즉 최대값이 된다. 32비트 기준으로는 4294967295가 저장됩니다. 

 

하지만 %d로 출력을 하면 그대로 -1이 출력이 되고, %u로 출력을 하면 4294967295이 출력이 된다.

 


 

5. 정수에서의 오버 플로우와 언더 플로우

: 정수형 변수가 표현할 수 있는 최대값(최소값)을 넘는 값을 저장하려고 할 때 발생하는 현상이다. 

 

 

[오버 플로우]

 

부호 있는 정수형에서 최대 값을 넘기면 음수의 최솟값이 나온다.

 

 

[부호가 있는 정수형에서의 오버 플로우]

#include <stdio.h>

int main() {
    int max = 2147483647;  // int의 최대값
    printf("Max int: %d\n", max);
    max = max + 1;         // 최대값을 초과
    printf("Overflow int: %d\n", max);  // 예상치 못한 값 출력
    return 0;
}

----------------------------
Max int: 2147483647
Overflow int: -2147483648
----------------------------

 

 

부호 없는 정수형에서 최대 값을 넘기면 0이 나온다.

 

 

[부호가 없는 정수형에서의 오버 플로우]

#include <stdio.h>

int main() {
    unsigned int max = 4294967295;  // unsigned int의 최대값
    printf("Max unsigned int: %u\n", max);
    max = max + 1;                  // 최대값을 초과
    printf("Overflow unsigned int: %u\n", max);  // 0 출력
    return 0;
}

-----------------------------------
Max unsigned int: 4294967295
Overflow unsigned int: 0
-----------------------------------

 

 


 

[언더 플로우]


부호 있는 정수형
에서 최소 값을 넘기면 양수의 최대 값이 나온다.

 

 

[부호가 있는 정수형에서의 언더 플로우]

#include <stdio.h>

int main() {
    int min = -2147483648;  // 32비트 정수의 최솟값
    min = min - 1;          // 언더플로우 발생
    printf("%d\n", min);    // 출력: 2147483647 (양수의 최대값)
    return 0;
}

 

 

부호 없는 정수형에서 최대 값을 넘기면 부호 없는 양수의 최대 값 이 나온다.

 

 

[부호가 없는 정수형에서의 언더 플로우]

#include <stdio.h>

int main() {
    unsigned int min = 0;  // 32비트 부호 없는 정수의 최솟값
    printf("Before underflow: %u\n", min);  // 최솟값 출력
    min = min - 1;  // 언더플로우 발생
    printf("After underflow: %u\n", min);  // 최대값이 출력됨
    return 0;
}

---------------------------
Before underflow: 0
After underflow: 4294967295
---------------------------

 

 


 

 

6. 실수에서 오버플로우 언더 플로우

: 정수형 변수가 표현할 수 있는 최대값(최소값)을 넘는 값을 저장하려고 할 때 발생하는 현상이다. 

 

 

[오버 플로우]

 

부호 있는 실수형에서 최대 값을 넘기면 양의 무한대(∞) 나온다.

 

 

[부호가 있는 실수형에서의 오버 플로우]

#include <stdio.h>

int main() {
    float large = 3.4e38;  // float의 최대값에 가까운 값
    large = large * 1000;  // 오버플로우 발생
    printf("%f\n", large); // 출력: inf (무한대)
    return 0;
}

 

 

부호 없는 정수형에서 최대 값을 넘기면 0이 나온다.

 

 

[부호가 없는 살수형에서의 오버 플로우]

#include <stdio.h>

int main() {
    unsigned int max = 4294967295;  // unsigned int의 최대값
    printf("Max unsigned int: %u\n", max);
    max = max + 1;                  // 최대값을 초과
    printf("Overflow unsigned int: %u\n", max);  // 0 출력
    return 0;
}

-----------------------------------
Max unsigned int: 4294967295
Overflow unsigned int: 0
-----------------------------------

 

 

오버플로우와 언더플로우를 방지하기 위해서는 어떻게 해야할까?

1. 범위 검사

: 연산 전에 값이 최대 값에 도달하는지 확인하여, 최대값을 넘은 연산을 방지한다.

 

2. 더 큰 자료형 사용

: 현재 자료형이 다룰 수 없는 큰 값을 처리해야할 때, 더 큰 자료형을 사용한다.

 

3. 조건부 연산 사용

: 값이 최대값에 도달하는지 확인하고 그에 따라 안전하게 연산을 수행한다.

 

 


 

7. 입출력 형식 지정자

정수형에서 형식 지정자 ★★★

자료형 형식 지정자 설명
short %hi 입력할 때는 %hi를 사용하는 것이 좋다. 출력은 %d도 가능하다.
int %d  
long %ld  
long long %lld 특히 입력할 때는 반드시 %lld를 사용하여야 한다. 출력도 마찬가지!

 

 

 

부동 소수점형에서 형식 지정자 ★★★

자료형 형식 지정자
float %f
double %lf
long double %Lf

 

부동 소수점형 형식 지정자 N.f와 .Nf를 사용해서 소수를 출력한다면

  • N.f는 소수점은 버리고, 정수부분만 N 자리를 맞춰서 출력한다. 
  • . Nf는 소수점 N자리까지만 출력한다. 
#include <stdio.h>

int main() {
    float value = 10.12345;

    printf("%4.f\n", value);   // 소수점 없이 최소 4자리 출력 ->     10
    printf("%.4f\n", value);   // 소수점 이하 4자리까지 출력 -> 10.1234

    return 0;
}

 


 

8. 16진수

 

 


 

9. 기호상수

: 상수에 이름을 붙인 것이다.

 

 

장점

1. 가독성 향상

: 숫자나 특정 값을 바로 사용하는 대신 의미 있는 이름을 사용하면 가독성이 올라간다.

 

2. 유지보수 용이

: 상수 값을 변경할 때 한 곳에서만 값을 수정하면 된다.

 

3. 재 사용성

: 같은 값을 여러번 사용해야할 때 하나의 상수로 재사용할 수 있다.

 


 

10. 1과 '1'의 차이

: 1은 정수이고, '1'은 문자 '1'을 나타내는 아스키코드이다.

 


 

11. 제어 문자★★★

: 출력 목적이 아닌, 제어 목적으로 사용되는 문자들

 

사용법

#include <stdio.h>

int main() {
    printf("\제어문자");  // 
    return 0;
}

 

 

제어 문자 이름 제어 문자 표기 의미
경고(bell) \a 7 '삐'하는 경고 벨소리 발생
줄바꿈 \n 10 커서를 다음 라인의 시작 위치로 옮긴다.
큰따옴표 \" 34 원래의 큰 따옴표 자체
작은따옴표 \' 39 원래의 큰 따옴표자체
역슬래시 \\ 92 원래의 역슬래시 자체

 

 

 

 

12. getchar()

: getchar()는 공백문자, 줄바꿈 문자도 받아드려서, 만약 getchar()를 사용한다면 getchar()를 사용해서 공백문자, 줄바꿈 문자를 없애고 입력을 받아야한다.

 

'2학년 2학기 > c언어' 카테고리의 다른 글

7장 배열  (1) 2024.10.25
6장  (1) 2024.10.25
5장 조건문  (0) 2024.10.24
4장 수식과 연산자  (0) 2024.10.23
2장 기초사항  (0) 2024.10.23