프로그래밍에서 변수는 데이터를 저장하는 상자이며, 자료형은 이 상자가 어떤 종류의 데이터를 담을지 정의합니다. 자료형은 시스템 아키텍처(32비트, 64비트)와 운영체제(Linux, Windows)에 따라 크기와 범위가 다를 수 있습니다. 또한, **오버플로우(Overflow)**와 **언더플로우(Underflow)**와 같은 특수 상황도 이해해야 합니다.
1. 자료형의 정의와 변수 선언
- 변수: 데이터를 저장하기 위한 이름이 있는 공간.
- 자료형: 저장할 데이터의 유형(숫자, 문자 등)과 크기를 정의.
자료형 예제
int age = 25; // 정수형
float pi = 3.14; // 실수형
char grade = 'A'; // 문자형
2. 기본 자료형과 운영체제 및 아키텍처별 차이
자료형 | 32bit Linux | 64bit Linux | 32bit Windows | 64bit Windows | 범위(signed) | 범위(unsigned) |
char | 1 byte | 1 byte | 1 byte | 1byte | -128 ~ 127 | 0 ~ 255 |
short | 2 byte | 2 byte | 2 byte | 2 byte | -32,768 ~ 32,767 | 0 ~ 65,535 |
int | 4 byte | 4 byte | 4 byte | 4 byte | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
long | 4 byte | 8 byte | 4 byte | 4 byte | -2,147,483,648 ~ 2,147,483,647 (32비트 기준) | 0 ~ 4,294,967,295 |
long long | 8 byte | 8 byte | 8 byte | 8 byte | -9,223,372,036,854,775,808 ~ ... | 0 ~ 18,446,744,073,709,551,615 |
float | 4 byte | 4 byte | 4 byte | 4 byte | 1.2E-38 ~ 3.4E+38 | N/A |
double | 8 byte | 8 byte | 8 byte | 8 byte | 2.3E-308 ~ 1.7E+308 | |
long double | 12~16 byte | 12~16 byte | 8 byte | 8 byte | 환경에 따라 다름 |
운영체제와 아키텍처 차이
- Linux vs Windows:
- Linux: long은 64비트에서 8바이트, Windows에서는 4바이트.
- long double은 Linux에서 더 높은 정밀도(12~16바이트)를 가짐.
- 32비트 vs 64비트:
- 64비트 환경에서는 주소 크기가 증가하므로 일부 자료형(long)이 더 큰 크기를 가질 수 있음.
3. signed와 unsigned의 차이
- signed: 양수와 음수를 모두 표현.
- unsigned: 음수를 제외하고 양수 범위를 2배로 확장.
예제 코드
signed int s = -10; // 양수와 음수 모두 가능
unsigned int u = 300; // 음수 불가능, 양수 범위 확장
4. 오버플로우와 언더플로우
오버플로우(Overflow)
변수에 저장 가능한 최대값을 초과했을 때 다시 최소값으로 돌아가는 현상.
예: unsigned char에서 255를 초과하면 0으로 돌아감.
언더플로우(Underflow)
변수에 저장 가능한 최소값 아래로 내려갔을 때 최대값으로 돌아가는 현상.
예: unsigned char에서 0 아래로 가면 255로 돌아감.
예제 코드
#include <stdio.h>
int main() {
unsigned char max = 255;
unsigned char min = 0;
max += 1; // 255를 넘어서 0으로 돌아감
min -= 1; // 0 아래로 가서 255로 돌아감
printf("Overflow: %u\n", max);
printf("Underflow: %u\n", min);
return 0;
}
5. 자료형 안전하게 사용하기
- 최대값과 최소값 확인
<limits.h>를 사용하여 자료형의 최대값과 최소값을 확인할 수 있습니다. - 초기화 습관
선언된 변수는 항상 초기화하세요. 초기화하지 않으면 쓰레기 값(Random Value)을 가질 수 있습니다.
#include <stdio.h>
#include <limits.h>
int main() {
printf("Max int: %d, Min int: %d\n", INT_MAX, INT_MIN);
printf("Max unsigned int: %u\n", UINT_MAX);
return 0;
}
6. 실습 코드: 자료형과 오버플로우 테스트
#include <stdio.h>
#include <limits.h>
int main() {
unsigned int u_max = UINT_MAX; // 최대값
int s_max = INT_MAX; // 최대값
int s_min = INT_MIN; // 최소값
printf("Unsigned int max: %u\n", u_max);
printf("Signed int max: %d\n", s_max);
printf("Signed int min: %d\n", s_min);
// 오버플로우와 언더플로우 테스트
u_max += 1; // 최대값 초과
s_max += 1; // 최대값 초과
s_min -= 1; // 최소값 초과
printf("After Overflow: Unsigned: %u, Signed max: %d, Signed min: %d\n", u_max, s_max, s_min);
return 0;
}
자료형은 프로그래밍의 기초이자, 안전한 코딩의 핵심입니다.
운영체제와 아키텍처에 따라 자료형의 크기와 동작이 달라질 수 있으므로 항상 이를 염두에 두고 작성해야 합니다. 또한, 오버플로우와 언더플로우 같은 특수 상황을 이해하면 버그를 예방할 수 있습니다.
'C' 카테고리의 다른 글
C) 제어문: 조건문, 반복문 (0) | 2024.11.28 |
---|---|
C) 연산자 (0) | 2024.11.25 |
C) 개발 환경 설정: 컴파일러 설치 및 설정 (1) | 2024.11.22 |
C) C 언어 소개 (0) | 2024.11.22 |
C 언어로 OOP 스타일의 Stack 구현하기 (0) | 2024.11.22 |