C & C++/강좌

C강좌 2. 자료형(DATA TYPE) 🔨 -정수형 편-

KALILIVE 2020. 11. 8. 12:07
반응형

아직 자료형을 생각하는 경우는 많이 없지만 앞으로 좀 더 규모가 큰 프로그램을 만들게 되면

자료형을 고려할 것이라고 생가한다. 

로직도 짜야되고 이런것도 생각해야 된다니.....

C언어에서 자료형이란 변수의 메모리 크기(점유하는 메모리량) 또는 해석하는 방법이라고 생각합니다.

또한 컴퓨터가 처리하는 정보는 오직 숫자뿐입니다.("A"라는 글자도 컴퓨터에서는 숫자로 처리합니다.)

여기서 변수란 어떤 데이터 값을 임시로 저장하는 공간을 말하는데요

예시로 만약에 저희가 어떤 값을 입력받아서 몇 개의 명령어를 처리한 뒤에 입력값을 출력하고 싶을 때 몇 개의 명령어가

처리될 때까지 입력값을 저장하는 장소를 변수라고 생각하시면 됩니다.

C언어의 자료형은 정수형, 실수형, 유도형, 함수형 등 다양한 형태가 존재합니다.

그럼 이제부터 배워보도록 합시다.

 


1. 정수형과 변수, 상수

정수 자료형과 표현 범위

크기 자료형 표현범위
8 Bit
(2^7=128)
(2^8=256)
char - 128 ~ 127
unsigned char 0 ~ 255
16 Bit
(2^15=32,768)
(2^16=65,536)
short  -32,768 ~ 32,767
unsigned shot 0 ~ 65,535
32 Bit
(2^31=2,147,483,648)
(2^32=4,294,967,296)

int - 2,147,483,648 ~ 2,147,483,647
unsigned int 0 ~ 4,294,967,295
long - 2,147,483,648 ~ 2,147,483,647
unsinged long 0 ~ 4,294,967,295

자 뭔가 자료형의 종류와 숫자가 여러 개 적혀있는 표가 있습니다. 이게 무엇을 뜻할까요?

컴퓨터는 0과 1을 이용해 연산처리를 합니다. 즉 2진법을 사용합니다.

이 0과 1중 하나가 표현된 공간을 1비트(1bit)라고 합니다. 그리고 8개의 Bit가 모이면 1바이트(Byte)라고 하죠

8bit = 1byte

왜 갑자기 바이트가 설명이 될까요?

네 맞습니다. 컴퓨터 메모리는 1비트 단위가 아닌 1바이트 단위로 데이터를 저장하기 때문입니다.

그리고 가장 왼쪽 1비트를 부호 비트(sign bit)로 사용합니다.

이 부호비트가 0이면 양수, 1이면 음수가 됩니다. 만일 8bit 자료형에서 부호 비트를 제외하면 데이터 비트는 7bit입니다.

데이터 구조

이런 형태로 메모리에 데이터가 저장됩니다. 그래서 위에 표대로 2^7 데이터를 저장할 수 있네요.

한 눈에 보이는 자료형 범위

출처 : dojang.io/mod/page/view.php?id=30

 


💪변수 선언

C언어에서는 변수를 맘대로 설정하는 것이 아니라 정해진 규칙이 있습니다.

변수를 선언할 때는 그 변수의 명확한 용도를 알 수 있도록 선언하는 것이 코드의 가용성을 높여줌으로 되도록

이름에 의미를 더해 선언해 줍시다.

(🤔저도 이게 무슨 변수인지 한참을 찾은 경험이 있어요 ㅠㅠ)

 

지금부터 변수 선언을 하면서 어떤 점을 주의해야 하는지 알려드리겠습니다.

  1.  
  2. 영문 대/소문자,_, 숫자로 만들어야 한다.
    int Data; (o)
       int _Data; (o)
       int _Data1; (o)
       int $Data, #Data; (x)
  3. 첫 글자는 숫자가 될 수 없다.
    int 1Data; (x)
  4. 중간에 공백 문자를 넣을 수 없다.
    int data length; (x)
  5. C언어의 예약어는 사용할 수 없다.
    int for; (x)

근데 여러분은 아직 C언어에서 사용하는 예약어들을 모르실 겁니다. 그래서 예약어 표를 준비했습니다.

 

📃C언어 예약어

auto break case char const
continue default do double else
enum extern float for goto
if int long register return
short signed sizeof static struct
switch typedef union unsigned void
volatile while      
_Bool _Complex _Imaginary inline  

🔎주의해야 할 점

반드시 지켜야 하는 점은 아니지만 다음과 같은 점을 고려해주시면 좋은 코더가 될 수 있습니다.

  1. 너무 긴 이름은 좋지 않다.
  2. 변수의 용도에 맞는 이름을 부여하는 것이 바람직하다.
  3. 의미 없는 이름을 남용하지 않는다.

위 3가지만 지켜주셔도 좋은 코드를 만드는데 도움이 됩니다.

1번의 경우

int this_is_to_show_char;

과 같이 긴 이름으로 너무 보기 힘든 코드는 자제해 주시는 것이 좋습니다.

또한 a, b, c 같은 이름을 생각하기 귀찮아서 대충 만든 변수 이름은 나중에 오히려 독이 될 수 있으니 조심해 자제해 주세요.


🦄 Char(문자)변수를 다뤄보자

컴퓨터는 숫자를 다루지 문자를 직접적으로 표현할 수 없습니다. 그래서 나온 대안은 특정 숫자를 문자로 변형해서

사용하는 방법이 도입되었습니다. 이를 부호체계라고 합니다.

예를 들어 65를 입력하면 "A"라는 문자가 출력되도록 규칙을 정하고 사용했습니다.

현재는 표준을 ASCII(American Standard Code for Information Interchange)로 통일해서 사용하고 있습니다.

ASCII 코드는 7bit로 문자를 표현하는 코드체계였습니다만 여기에 확장 비트를 하나 더해 

대게 8bit 즉 1byte로 표현됩니다. 

위 표에서 char이라는 문자 변수가 8bit를 가지는 이유가 바로 이 아스키 체계에서 8bit를 사용하기 때문입니다.!!!

char ch ='A';
char ch2 = 65;
char ch3 = "65";

위 3개의 코드를 보며

char 변수명 = value;

형태로 변수를 선언하고 저장하는 형태를 볼 수 있습니다.

이전에 제가 포스팅해둔 글에 있는 ASCII표를 참고하여 원하는 문자를 한 번 저장해 봅시다.

[Python/OpenCV 관련 잡다한 지식] - OpenCV 키보드 이벤트 관련 ASCII표

 

OpenCV 키보드 이벤트 관련 ASCII표

문자에서 원하는 처리 키보드이벤트를 찾은뒤에 cv2.waitKey()== 로 처리하면 됩니다. 예제) ESC 키 cv2.waitKey() == 0x1B 10진수 16진수 문자 10진수 16진수 문자 10진수 16진수 문자 10진수 16진수 문자 0 0x00..

kali-live.tistory.com

표를 참고하시면 10진수는 65라고 값이 명시되어있고 문자에는 A라고 표기되어 있습니다.

즉 65를 입력하면 A라는 문자가 출력된다는 뜻입니다.

👁‍🗨short

short형은 부호가 있는 16비트 정수형이다.

정수를 담는 용도의 자료형은 맞지만 표현의 범위가 작아서 거의 사용되지 않는다.

부호가 없는 unsigned short로 선언해도 2^16까지 밖에 표현할 수 없어서 보통 int

이 두 자료형을 언급하는 이유는 보통 저수를 표현하는 가장 보편적인 방법이 int형인데 소스코드에서 상수를 표현할 때 int와 short를 별도로 구별하지 않는다. 그리고 wchar_t형 문자 상수는 char형과 달리 앞에 L이 붙는다.

short s = 1234;
wchar_t = L'A';

 

🚀실습

#include<stdio.h>

int main(void) {

	char ch = 'A';
	wchar_t wch = L'A';
	short sData = 10;
	int Data = 10;
	long lData = 10L;
	long int lnData = 10L;
	long long int llnData = 10LL;

	unsigned char uch = 0;
	unsigned short usData = 65535U;
	unsigned int uData = 10U;
	unsigned long ulData = 1UL;
	unsigned long int ulnData = 1UL;
	unsigned long long int ullnData = 1ULL;
	return 0;
}

실행화면

위 코드를 각각의 자료형의 범위 안에서 정수를 저장하면 아무 이상 없이 실행이 된다.

또한 코드를 보면 규칙이 보인다.

문자 상수의 경우 앞에 L의 존재 여부에 따라 char형과 wchar_t형으로 나눠진다.

또한 자료형 앞에 unsigned가 포함되면 상수 끝에 U이 붙고 long이 포함되면 L이 붙는다.

그래서 unsigned long long 은 ULL이 붙는다.

 

같은 원리로 '1'은 char형 문자 상수이고 1은 int형 상수이다.

1L과 1LL은 long int와 long long int로 같은 1이 아니니 주의할 필요가 있다.

unsigned short형은 16비트 자료형이므로 0~2^16-1 (65,536까지 표현할 수 있다.)

따라서 65,537 이상의 숫자를 저장하면 한계를 넘어선다.(흔히 overflow라고 함)

 

그러면 한 번 오버플로우를 일으키면 어떻게 될까?

 

실행 화면
오류 목록

메모리에 저장된 변수가 한계를 넘어서면 바로 뒤에 있는 메모리 공간을 침범할 수 있다.

만약 그럴 경우 메모리가 엉망진창으로 변하기 때문에 VS에서는 미리 검토를 해 다음과 같이 오류로 

출력해 준다.

그러니 항상 어느 정도 큰 숫자를 다룰 때는 자료형을 고려하자.

 

이번 강좌는 여기까지 입니다.


🧻업데이트 완료🧻

2020-11-08

수능이 며칠 안 남아서 아마 당분간은 글을 쓰기 힘들 것 같네요....

2020-11-17

일주일 만에 다시 블로그 글을 잠깐 쓰고 갑니다~ 👀

2021-05-27

정말 오랜만이네요... 오늘은 과연 이 글을 다 쓸 수 있을지....

2021-05-27(23:29)

-글을 다쓴후-

이걸 한 페이지에 다 작성하면 글이 엄청 길어질 것 같아서 

또 나눠서 분배합니다....

다음 강좌에서는 실수 자료형을 다뤄봅시다!

반응형