A. 기본 자료형(data type)
1. 기본 자료형
a. 자료형이란?
🌟 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할
기본 자료형: C 언어에서 미리 여러 형태의 타입을 작성하여 제공하는 것 (타입 = 기본 자료형)
이러한 기본 자료형은 아래와 같이 나눌 수 있음
b. 정수형 타입
정수 : 부호를 가지고 있고, 소수 부분이 없는 수
🌟 대표적으로 short, int, long
정수형 타입 | 할당되는 메모리 크기 | 데이터의 표현 범위 |
(signed) short | 2 바이트 | - 32,768 ~ 32,767 |
unsigned short | 2 바이트 | - 0 ~ 65,535 |
(signed) int | 4 바이트 | - 2,147,483,648 ~ 2,147,483,647 |
unsigned int | 4 바이트 | - 0 ~ 4,294,967,296 |
(signed) long | 4 바이트 | - 2,147,483,648 ~ 2,147,483,647 |
unsigned long | 4 바이트 | - 0 ~ 4,294,967,296 |
🧡 unsigned 키워드
부호를 나타내는 최상위 비트(MSB, Most Significant Bit)까지도 크기를 나타내는 데 사용
즉, 음수를 표현할 부분을 포기하는 대신, 두배로 양의 정수를 표현할 수 있게 됨
반대인 signed 키워드는 모든 타입에서 기본적으로 생략되어 있는 것
💙 최상위 비트(MSB, Most Significant Bit)란?
1바이트를 구성하는 8개의 비트 중 최고값을 갖는 비트를 의미
🧡 오버플로우(overflow)
해당 타입이 표현할 수 있는 최대 범위보다 큰 수를 저장할 때 발생하는 현상
오버플로우가 발생하면 최상위 비트(MSB)를 벗어난 데이터가 인접 비트를 덮어쓰므로, 잘못된 결과를 얻음
반대인 언더플로우(underflow) : 해당 타입이 표현할 수 있는 최소 범위보다 작은 수를 저장할 때 발생하는 현상
🤓 예제 :
int num = 2147483647; // int형 타입이 저장할 수 있는 최댓값인 231 - 1
printf("변수 num에 저장된 값은 %d입니다.\n", num);
num = 2147483648; // int형 타입이 저장할 수 없는 숫자인 231
printf("변수 num에 저장된 값은 %d입니다.\n", num);
✨ 실행결과
변수 num에 저장된 값은 2147483647입니다.
변수 num에 저장된 값은 -2147483648입니다. //오버플로우가 발생해 값이 음수로 저장되어버림
💙 데이터 처리 속도
정수형 중에서도 int형의 데이터를 가장 빠르게 처리해 보편적으로 크기에 상관없이 int형을 가장 많이 사용
(16bit라면 2바이트, 32bit이상부터 4바이트)
c. 실수형 타입
실수 : 소수부나 지수가 있는 수를 가리키며, 정수보다 훨씬 더 넓은 표현 범위를 가짐
🌟 대표적으로 float, double
실수형 타입 | 할당되는 메모리 크기 | 데이터의 표현 범위 |
float | 4 바이트 | (3.4 X 10-38) ~ (3.4 X 1038) 소수 부분 6자리까지 오차없이 표현 |
double | 8 바이트 | (1.7 X 10-308) ~ (1.7 X 10308) 소수 부분 15자리까지 오차없이 표현 |
long double | double형과 동일함. | double형과 동일함. |
💥 WARNING
컴퓨터에서 실수를 표현하는 방식은 반드시 오차가 발생하는 기술적 한계
이러한 실수형 데이터의 오차는 C언어뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통된 문제임
🤓 예제 : 소수점을 16자리 가지는 실수를 float형과 double형 변수에 각각 대입
float num01 = 3.1415926535897932; // float 타입의 유효 자릿수는 소수점 6자리
printf("변수 pi에 저장된 값은 %.20f입니다.\n", num01);
double num02 = 3.1415926535897932; // double 타입의 유효 자릿수는 소수점 16자리
printf("변수 pi에 저장된 값은 %.20f입니다.\n", num02);
✨ 실행결과
변수 num01에 저장된 값은 3.14159274101257324219입니다. //7점자리 부터 오류
변수 num02에 저장된 값은 3.14159265358979311600입니다. //16자리 부터 오류
💙 INFO
하드웨어의 발달로 인한 메모리 공간의 증가로 현재에는 double형을 가장 많이 사용
d. 문자형 타입
문자형 데이터 : 문자 하나를 표현할 수 있는 타입을 의미
🌟 대표적으로 char
문자형 타입 | 할당되는 메모리의 크기 | 데이터의 표현 범위 |
(signed) char | 1 바이트 | 27 ~ 2-7 |
unsigned char | 2 바이트 | 0 ~ 2-8 |
🧡 아스키코드(ASCII)
컴퓨터는 2진수밖에 인식하지 못하므로, 문자도 숫자로 표현해야 컴퓨터가 인식
따라서 어떤 문자를 어떤 숫자에 대응시킬 것인가에 대한 약속이 필요한데 이 중 가장 많이 사용되는 것이 바로 아스키코드(ASCII)
아스키코드(ASCII) : 영문 대소문자를 사용하는 7비트의 문자 인코딩 방식
아스키코드는 문자를 7비트로 표현하므로, 총 128(2의 7승)개의 문자를 표현할 수 있음
👉 아스키코드의 구성
- 출력할 수 없는 33개의 문자
- 출력할 수 있는 52개의 영문 대소문자, 10개의 숫자, 32개의 특수 문자와 1개의 공백 문자 = 128개
🤓 예제 : char형 변수에 저장된 문자를 여러 서식 지정자를 사용하여 출력
char ch = 'a';
printf("변수 ch에 저장된 값은 %c입니다.\n", ch);
printf("변수 ch에 저장된 값은 %d입니다.\n", ch);
✨ 실행결과
변수 ch에 저장된 값은 a입니다. // 서식 지정자 '%c'를 사용하여 출력한 결과는 제대로 문자 'a'가 출력
변수 ch에 저장된 값은 97입니다. //서식 지정자 '%d'를 사용하여 출력한 결과는 97이라는 숫자로 출력
👉 C++ 내부적으로는 아스키코드에 해당하는 숫자로 저장되어 있음을 보여줌
B. 자료형 변환(type conversion)
1. 자료형 변환
a. 자료형 변환이란?
하나의 자료형을 다른 자료형으로 바꾸는 행위
👉 자료형 변환을 하는 이유
C언어에서는 다른 자료형끼리의 연산은 모두 같은 자료형으로 만든 후 수행하기 때문!
b. 자료형 변환의 유의점
표현 범위가 좁은 자료형 ➡ 표현 범위가 더 넓은 자료형으로의 타입 변환 👍
반대의 경우에서는 자료형 변환에서는 데이터의 손실이 남 👎👎👎
c. 자료형 변환의 종류
1) 묵시적 타입 변환(자동 타입 변환)
2) 명시적 타입 변환(강제 타입 변환)
2. 묵시적 타입 변환(자동 타입 변환, implicit type conversion)
a. 묵시적 타입 변환이란?
🌟 대입 연산이나 산술 연산에서 C 컴파일러가 자동으로 실행해주는 타입 변환
b. 변환 방법
1) 대입연산 : 오른쪽에서 왼쪽 타입으로 변환
2) 산술연산 : 데이터의 손실이 최소화 되는 방향으로 변환
산술 연산에 대한 결괏값의 타입은 피연산자의 타입과 언제나 일치
💥 즉 int형 데이터끼리의 산술 연산에 대한 결괏값은 언제나 int형 데이터
c. 변환 순서
char 형 → short 형 → int 형 → long 형 → float 형 → double 형 → long double 형
즉, 점점 더 큰 방향으로 (데이터 손실이 최소화 되는 방향) 변환된다
d. 변환 예제
1) 대입 연산
🤓 예제 : 대입 연산에서 일어나는 묵시적 타입 변환
char ch = 200;
int num01 = 3.14;
double num02 = 5;
printf(" ch에 저장된 값은 %d입니다.\n", ch);
printf("num01에 저장된 값은 %d입니다.\n", num01);
printf("num02에 저장된 값은 %f입니다.\n", num02);
✨ 실행결과
ch에 저장된 값은 -56입니다. //표현할 수 있는 범위 ⬆ 데이터라 값 변경 (데이터 손실 ⭕)
num01에 저장된 값은 3입니다. //int in 실수 = 소수 부분이 자동으로 삭제 (데이터 손실 ⭕)
num02에 저장된 값은 5.000000입니다. //double ➡ int = double (데이터 손실 ❌)
2) 산술 연산
🤓 예제 : 산술 연산에서 일어나는 묵시적 타입 변환
double result01 = 5 + 3.14;
double result02 = 5.0f + 3.14;
printf("result01에 저장된 값은 %f입니다.\n", result01);
printf("result02에 저장된 값은 %f입니다.\n", result02);
✨ 실행결과
result01에 저장된 값은 8.140000입니다. //int ➕ double = double (double에 저장해 데이터 손실 ❌)
result02에 저장된 값은 8.140000입니다. //float ➕ double = double (double에 저장해 데이터 손실 ❌)
3. 명시적 타입 변환(강제 타입 변환, explicit type conversion)
a. 명시적 타입 변환이란?
🌟 사용자가 타입 캐스트(type cast) 연산자를 사용하여 강제적으로 수행하는 타입 변환
b. 타입 변환 방법
변환하고자 하는 데이터의 앞에 괄호(()) 즉, 타입 캐스트(type cast) 연산자를 추가하고 그 안에 변환할 타입 명시
그냥 네이밍 한다고 생각하면 됨 ex) (소년) 명수
c. 변환 예제
🤓 예제 : 명시적 타입 변환
int num01 = 1;
int num02 = 4;
double result01 = num01 / num02;
double result02 = (double)num01 / num02;
printf("result01에 저장된 값은 %f입니다.\n", result01);
printf("result02에 저장된 값은 %f입니다.\n", result02);
✨ 실행결과
result01에 저장된 값은 0.000000입니다. //산술 연산 법칙에 따라 결과값이 int형이기 때문에 0으로 출력 (only 산술연산)
result02에 저장된 값은 0.250000입니다. //두개 중 하나를 double로 변환했기 때문에 double값을 얻을 수 있음 (명시 + 산술연산)
출처 : http://www.tcpschool.com/c/c_datatype_basic
출처 : http://www.tcpschool.com/c/c_datatype_typeConversion
'프로그래밍 언어 > C' 카테고리의 다른 글
C 연산자 총정리 -2 (비교, 논리, 비트, 기타 등) (0) | 2023.08.16 |
---|---|
C 연산자 총정리 -1 (산술, 대입, 증감) (0) | 2023.08.16 |
C 상수 총정리 (0) | 2023.08.16 |
C(++) 변수 총정리 (0) | 2023.08.16 |
C언어와 프로그램의 이해 (0) | 2023.08.16 |