데이터 타입
✒️ 2025-05-15 15:49 내용 수정
수제비 2024 정보처리기사 필기 5판 1권의 내용을 정리
TCPSchool의 내용을 정리
데이터를 메모리에 저장하는 방식과 처리되는 방식을 명시적으로 알려주는 역할
- Java의 데이터 타입(데이터 타입(Data Types)), JavaScript의 자료형(자료형), Python의 자료형(자료형)도 참고.
- 데이터 타입을 결정할 때 데이터의 최대 크기를 고려해야 한다.
- 최대 범위를 벗어나거나(오버플로우, Overflow) 최소 범위를 벗어나면(언더플로우, Underflow)전혀 다른 값이 저장될 수 있다.
정수형
- 참고 자료 : MS 데이터 형식 범위
- 부호가 있고, 소수 부분이 없는 수이다.
unsigned키워드를 사용하면 부호를 나타내는 최상위 비트까지도 크기를 나타내는 데 사용할 수 있다.- 최상위 비트 : 1 바이트를 구성하는 8개의 비트 중 최고값을 갖는 비트
- 음수를 표현할 수 없는 대신, 0을 포함한 양수 표현을 두 배 더 많이 표현할 수 있다.
signed키워드는 기본적으로 생략하여 사용된다.
| 타입 | 메모리 크기 | 표현 범위 |
|---|---|---|
| short | 2 byte | -32,768 ~ 32,768 |
| unsigned short | 2 byte | 0 ~ 65,535 |
| int | 4 byte | -2,147,483,648 ~ 2,147,483,648 |
| unsigned int | 4 byte | 0 ~ 4,294,967,296 |
| long | 4 byte | -2,147,483,648 ~ 2,147,483,648 |
| unsigned long | 4 byte | 0 ~ 4,294,967,296 |
| long long | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
| unsigned long long | 8 byte | 0 ~ 18,446,744,073,709,551,615 |
#include <stdio.h>
int main(void)
{
short s1 = 10;
int i1 = 500000;
long l1 = 10203949;
long long ll1 = 9223372036854775805;
printf("short %d\n", s1);
printf("int %d\n", i1);
printf("long %i\n", l1);
printf("long long %ld\n", ll1);
return 0;
}
short 10
int 500000
long 10203949
long long 9223372036854775805
실수형
- 소수나 지수 부분이 있는 숫자이며, 정수보다 더 넓은 표현 범위를 가진다.
- 컴퓨터에서 소수 부분을 표현할 때는 오차가 반드시 생기므로 연산 시 주의해야 한다.
| 타입 | 메모리 크기 | 표현 범위 |
|---|---|---|
| float | 4 byte | 3.4E +/- 38(7자리 숫자) |
| double | 8 byte | 1.7E +/- 308(15자리 숫자) |
| long double | 8 byte | double과 동일 |
#include <stdio.h>
int main(void)
{
float f1 = 3.14159265;
double b1 = 1.68E308;
printf("float %f\n", f1);
printf("double %f\n", f1);
return 0;
}
float 3.141593
double 168000000000000006634499432629324058099321591546296460407724972322402843086364687631742933169384835234322016627457252440649344102750463933925406947597510143106548712248522894439985397777914402834899017369628371218125244198943165482409138301211757462979529714163903795393980405362403727040258196554748398665728.000000
문자형
- 문자 하나를 표현할 수 있는 타입이며, ASCII 코드를 사용하여 영문 대소문자를 표현한다.
| 타입 | 메모리 크기 | 표현 범위 |
|---|---|---|
| char | 1 byte | 2^(-7) ~ 2^7 |
| unsigned char | 2 byte | 0 ~ 2^(-8) |
#include <stdio.h>
int main(void)
{
char c1 = 'a';
printf("char %c\n", c1);
printf("char %d\n", c1);
return 0;
}
char a
char 97
타입 변환
하나의 타입을 다른 타입으로 바꾸는 행위
- Java의 형변환(형 변환(Casting)), JavaScript의 형변환(형 변환) 참고.
- 표현 범위가 좁은 타입 -> 넓은 타입으로의 변환은 문제가 없으나, 그 반대의 경우엔 데이터 손실이 발생할 수 있다.
1. 자동 타입 변환(묵시적 타입 변환)
- 자동으로 컴파일러가 타입을 변환해주는 타입 변환이다.
- C에서 대입 연산 시 연산자 오른쪽에 있는 데이터 타입이 연산자 왼쪽에 있는 데이터 타입으로 자동 타입 변환된다.
- 산술 연산 시 데이터 손실이 최소화 되는 방향으로 타입 변환이 진행된다.
- char -> short -> int -> long -> float -> double -> long double
#include <stdio.h>
int main(void)
{
char c = 907;
int num = 3.14;
double test = 5;
printf("char c 저장 값 : %d\n", c);
printf("int num 저장 값 : %d\n", num);
printf("double test 저장 값 : %f\n", test);
return 0;
}
char c 저장 값 : -117
int num 저장 값 : 3
double test 저장 값 : 5.000000
2. 강제 타입 변환(명시적 타입 변환)
- 사용자가 타입 캐스트(type cast) 연산자를 사용하여 강제적으로 수행하는 타입 변환이다.
- 변환하려는 데이터 앞에
(변환할타입)을 추가한다.
#include <stdio.h>
int main(void)
{
int a = 3;
int b = 5;
double da = 3 / 5; // 산술 결과는 int
double db = (double) 3 / 5; // 산술 결과를 double로 변환
printf("%d / %d : %f\n", a, b, da);
printf("(double) %d / %d : %f\n", a, b, db);
return 0;
}
3 / 5 : 0.000000
(double) 3 / 5 : 0.600000