프로그래밍 언어/C

[자료형(data type)] 기본형 총정리

순정법사 2023.08.16
더보기
자료형 중 기본형 공부 / https://ddanzimind.tistory.com/32

 

A. 기본 자료형(data type)

1. 기본 자료형

a. 자료형이란?

🌟 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할

 

기본 자료형: C 언어에서 미리 여러 형태의 타입을 작성하여 제공하는 것 (타입 = 기본 자료형)

이러한 기본 자료형은 아래와 같이 나눌 수 있음

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=angelcorean&logNo=220804837093

 

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언어뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통된 문제임
 

[C언어 참조] 정수와 실수의 표현

A. 정수의 표현 1. 정수의 표현 컴퓨터에서 정수를 표현하는 방법은 아래 두가지로 생각할 수 있음 a. 부호 없는 정수 해당 정수 크기의 절댓값을 2진수로 변환하여 표현 b. 부호 있는 정수 음수를

monamu.tistory.com

 

🤓 예제 : 소수점을 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

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

출처 : http://www.tcpschool.com/c/c_datatype_typeConversion

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com