프로그래밍 study/C언어

CH3 변수

박재완 2022. 3. 21. 19:00
728x90
반응형

변수란?


특정 값을 저장하는 메모리 공간을 뜻한다. 해당 메모리 공간에 저장되는 값은 정수형(integer(int)), 실수형(float, double),문자(char)및 문자열(String) 등 여러가지 형식이 있으며 이를 이용하여 프로그래밍 한다. 해당 메모리 공간에는 허용되는 범위 내에 어떤값이든 저장할 수 있으므로 변수라고 하며, 허용되는 범위보다 큰 값을 저장하려고 할 때 오버플로가 발생한다.
각 프로그래밍 언어에 따라 변수의 선언 대입 연산 조금씩 차이가 발생한다.
변수의 선언별 크기 는 다음과 같이 볼 수 있다.

형태 크기
bool 1바이트 참/거짓
unsigned short int 2바이트 0~65,535
short int 2바이트 -32,435~32,767
unsigned long int 4바이트 0~4,294,967,295
long int 4바이트 -2,147,483,648~2,147,483,647
int(16비트) 2바이트 -32,768~32,767
int(32비트) 4바이트 -2,147,483,648~2,147,483,647
unsigned int(16비트) 2바이트 0~65,535
unsigned int(32비트) 4바이트 0~4,294,967,295
char 1바이트 256 문자값들
float 4바이트 1.2e-38~3.4e38
double 8바이트 2.2e-308~1.8e308

출처: https://j07051.tistory.com/282 [흘러간다...]
해당 변수를 형을 선언 하는 순간 메모리에는 해당 변수가 저장 될 수 있는 크기(1 ~ 8 byte)가 생성되어 있는 것이 되며 우리가 변수를 지정 또는 선언 하여 값을 대입 할때 해당 지정 위치에 공간을 차지 하게 된다.
위와 같은 크기는 선언과 동시에 이루어 지는 것이기 때문에 지난 시간 각 데이터 형태별로 선언 하는 방법에 차이를 보이는 printf scanf또한 데이터를 참조 하는 과정에서 선언된 형과 동일하거나 비슷한 크기의 타입을 지정 해주는 것이 같은 이유이다.
만약 이러한 형태가 무시 된다면 오류 또는 overflow , underflow 와 같은 에러가 발생하여 원하는 동작과는 크게 다른 동작을 할 수 있다. 이러한 에러는 다음과 같은 예시를 통해서 쉽게 확인 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main(void) {
    unsigned int a;
 
    a = 4294967295;
 
    printf("a : %d\n", a);
 
    //a = -1; ref -1 == 4294967295 
    printf("a : %u", a);
 
    return 0;
}
cs

 

해당 코드를 실행 하게 된다면

분명 같은 숫자를 선언하고 있는 상태이지만 각 허용 범위를 초과하여 다음과 같은 현상이 발생하였다.
0~4,294,967,295 <- unsigned int 의 경우 이만큼의 숫자를 표시 할 수 있지만
-2,147,483,648~2,147,483,647 <- 일반적인 int의 경우 양수의 범위는 약 그 절반에 해당 된다.
4294967295 - 2147483647 = 2147483648 만큼의 숫자가 넘쳐 흐르는 오버 플로우가 발생한다.
이런 경우 int형에서 선언된 최 하단 값은 -2147483648 부터 다시 올라가게 된다.
그렇게 -1 이라는 값이 출력 된다.

계산이 복잡하다면 메모리내에 저장된 형태를 통해서 보면 다음과 같이 확인 할 수 있다.

부호 비트로 인하여 4294967295 는 int에서 -1로 인식하여 출력된 결과로 볼 수 있다.

변수도 생각보다 고려해야 할 사항이 있기 때문에 많이 중요한 부분이 될 수 있다.

 

728x90
반응형

'프로그래밍 study > C언어' 카테고리의 다른 글

CH4 산술 관계 논리 연산자  (0) 2022.03.24
CH3-2 데이터 입력  (0) 2022.03.22
CH1 프로그램 언어 C 컴파일 과정  (0) 2022.03.18
CH2 C언어 상수와 데이터 출력  (0) 2022.03.18