티스토리 뷰

C언어

C언어 자료형/상수

블로그 강승 2021. 3. 10. 19:52

C언어 자료형/상수

C언어 자료형과 상수에 대해 공부한걸 요약했다. Do it! C언어 입문(저자:김성엽) 이란 책을 통해 공부했으며, 책의 카테고리를 바탕으로 필자가 이해한 내용을 요약하는 글이다. 내용이 궁금하거나 찾아야 할 내용이 있으면, 필자가 정리한 글을 다시 보면서 복습하기위해 작성했다. 바로 아래에서 글을 확인하도록 하자.

 

메모리

메모리는 1바이트(Byte) 단위로 주소가 매겨져 있다.
하지만 주소가 1바이트 단위로 부여돼있다고 해서 데이터가 꼭 1바이트 단위로 저장돼야 하는 건 아니다.
1바이트 단위는 운영체제가 메모리를 관리하는 단위이고, 컴퓨터는 이보다 더 작은 비트단위로 정보를 저장하거나 읽을 수 있다.

1비트
1비트는 0또는 1을 저장할 수 있는 공간임.
(1바이트 = 8비트)

부호 비트를 사용하여 양수와 음수를 구별

부호 비트(0:양수, 1:음수) 0 or 1 0 or 1 0 or 1 0 or 1 0 or 1 0 or 1 0 or 1

01111111 : 양수의 최댓값 = 127
10000000 : 음수의 최솟값 = -128
11111111 : 음수의 최댓값 = -1

※메모리 절약을 위해 자료형의 크기는 요즘에도 잘 정해줘야 함.

아스키(ASCII) 코드
십진수 48 = 문자'0' (여기서 '0'은 문자 0이지 숫자0이 아님)
십진수 65 = 문자'A'
십진수 97 = 문자'a'

문자를 서로 다른 장치가 알아먹을 수 있게 표준으로 정한 것임.
(기계어 (0과 1)로만 서로 알아 먹을 수 있기 때문에 숫자로 정해 놓은거임)

 

자료형

컴퓨터 메모리가 1바이트(Byte)로 되어있다고 해서 꼭 1바이트에만 저장할 필요 없음.
2바이트 4바이트 이런 식으로 본인이 원하는 메모리(저장공간)를 할당할 수 있음.
원하는 메모리(저장공간)를 자료형 {데이터 타입(Data Type)}으로 명시할 수 있음.

C 언어는 사용 빈도가 높은 자료형은 예악어로 제공(Built-in Data Type)함.
나머지는 사용자가 만들어서 사용할 수 있는 문법(User-defined Data Type)을 제공함.

 

정수를 표현하는 자료형

(signed)char

signed는 생략해도 됨. 1바이트 공간을 쓰고, 맨 앞은 부호비트임. -128~127을 입력 가능함.


unsigned char

unsigned 생략 불가능. 1바이트 공간을 쓰고, 부호비트X. 0~255까지 입력 가능함.


(signed) short (int)

short 또는 signed short 또는 singed short int 또는 short int 다 사용 가능함. 괄호 안은 마음대로 생략 가능.
2바이트 공간을 사용하고. 맨 앞은 부호비트임.  -32768~32767 입력 가능


(signed)(long) int 또는 (singed) long (int)

괄호 생략 가능. 4바이트 공간 차지. 맨 앞은 부호비트. -2,147,483,648~2,147,483,647 입력 가능.


unsigned (long) int 또는 unsigned long (int)

괄호 생략 가능. 4바이트 공간 차지. 부호비트 X. 0~4,294,967,295 입력 가능.

 

실수를 표현하는 자료형

float와 double이 있음.


부동소수점

부동소수점(Floating-point) 표현 방식이란 실수를 표현할 때 소수점의 위치를 고정하지 않고 소수점의 위치를 나타내는 수를 따로 적는 방식. 실수를 표현하는 자료형은 4바이트 float , 8바이트 double이 있음.
314.6572를 3.146572 E2이라고 적기도 함. 이걸 실수 자료형 변수를 선언해 넣으면 컴퓨터가 알아서 계산해서 알아들음.

 

32비트 부동소수점 표현 : float

32비트 부동소수점 이미지

float에 저장할 수 있는 값의 범위는 1.2E-38~3.4 E38이다.
2^128=3.4E38
2^-126=1.2E-38 (물론 둘 다 반올림해서 저렇게 된 거라 정확한 값은 아니다)
float에는 소수점 이하 6자리만 들어갈 수 있다고 한다.

float a;
a=3.6666661111;

출력값 : 3.6666662784

그래서 6자리 이하의 숫자는 잘못된 값을 출력한다.

여기서 bias는 아직 정확히는 모르겠는데
3.4 E38이라고 치면 지수부는 38이다. 이걸 2진수로 넣을 때 bias가 127이니,
127+38 = 165가 지수부 8Bit에 들어간다고 한다. 어차피 이건 컴퓨터가 알아서 계산한다고 하니 정확하게 몰라도 된다고 해서 일단은 넘기려고 한다.

 

64비트 부동소수점 표현 : double

64비트 부동소수점 이미지

double에 저장할 수 있는 값의 범위는 2.2E-308~1.8 E308이다.
2^1024 = 1.8E308 (어림잡아서)
2^-1022 = 2.2E-308 (어림잡아서)

이 자료형은 64비트 기반이라 소수점 이하 14자리까지 안전하게 저장 가능.

 

상수

변하지 않는 정보를 상수라 함. 숫자형, 문자형, 문자열형으로 구분 가능.

 

숫자형 상수

-5, 0, 1, 2, 0.17, 0.15e+3

 

정수형 상수의 다양한 진법 표현

10진수 9 10
8진수 011 012
16진수 0X9 또는 0X9 0XA 또는 0XA

8진수는 10진수와 구분하기 위해서 앞에 0을 붙여주고, 16진수는 0X 또는 0x를 붙인다. 여기서 0은 영어 O가 아니라 숫자 0이다.

 

문자형 상수(Character Constant)

작은따옴표(')를 사용해서 표현하며 영문자(Alphabet), 숫자형 문자(Digit), 특수 문자(Special Character)로 구분됨.
영문자는 a~z, A~Z 가있고 작은따옴표를 붙여 사용함.
ex) 'a', 'b', 'c', 'A', 'B', 'C'
숫자형 문자는 0~9의 숫자임.
ex)
'1', '2', '3' 
특수 문자는 *,-,+,= 이런 거임
ex)
'*', '-', '+', '='

 

문자열형 상수(Character-string Constant)

" "(큰따옴표)로 묶어서 표현함. 일반적으로 문자 하나는 1바이트를 차지함.(한글 문자는 하나당 2바이트)
하지만, "Hello~"는 7바이트를 차지함. 왜냐하면 문자열은 끝을 표시하기 위해 0이 추가되기 때문임.
(여기서 0은 숫자 0이 아니라 다른 의미임)(아직 안 배워서 모름)

'H' 'e' 'l' 'l' 'o' '~' 0

※문자 '3'을 '03'으로 적으면 1바이트 변수에는 '3'의 아스키코드 값이 저장되고, 2바이트 변수에는 앞의 1바이트는 '0'의 아스키코드, 뒤의 1바이트에는 '3'의 아스키코드가 들어간다.

 

변수(Variable)

1. 값이 바뀌는 정보 2. 저장 공간

 

변수 이름

메모리는 1바이트 단위로 부여된 주소(Address)로 구분되는데, 개발자가 주소를 일일이 알 수 없으니
그 주소에 이름을 붙여주는 게 변수 이름임. (변수 ---컴파일(번역)---> 메모리 주소)

int n; /*4바이트 메모리 공간을 주소 대신 n이라는 변수 이름으로 사용*/

 

변수 이름 정할 때 주의할 점

1. 숫자만 이루어지거나 숫자로 시작하면 안 됨.
2337, 2_babo (X) 

2.  띄어 쓰면 안 됨.
name 1 , ba bo (X)

3. 소문자 대문자 구별하니, 다른 거를 인지해야 함.
name, Name, nAme, naMe, namE // 다 다른 변수임

 

카멜 표기법(Camel Notation)

soccerkick 이러면 연결된 단어가 헷갈리게 보이니까
soccerKick 이렇게 만나는 부분을 대문자로 써줌. 낙타 등같이 올라갔다해서 카멜 표기법이라 부름.

 

헝가리언표기법(Hungarian Notation)

c_babo, n_data
변수 앞에 자료형을 알리는 알파벳을 써서 안 헷갈리게 함.

 

변수 선언

자료형 변수 이름 세미콜론. 순으로 써야 함.

int soccer; 는 부호 있는 4바이트 soccer 변수를 선언한 거임.
soccer에 4바이트 정보를 저장하거나 soccer에 있는 4바이트 정보를 이용할 때
soccer라는 변수를 주소 대신에 사용하면 됨. 세미콜론은 구분자(Separator)로서 명령이 끝났음을 알려줌.

int data1;
int data2;      ===   int data1, data2, data3;
int data3;

양쪽은 같은 말임. 같은 자료형의 변수를 만들땐 컴마 찍고 나열해도 됨.

 

변수초기화

변수를 선언하면 예전에 어떤 정보가 있을지 모르는 메모리 주소를 그대로 이용하기 때문에
우리가 알지 못하는 쓰레기 값이 있음.
이걸 초기화하는걸 변수 초기화라고 하는데
char trash =0; trash라는 변수에 어떤 정보가 있을지 모르는데 0이란 정보를 기입해서 0으로 초기화해주는 모습임.

 

2진수를 16진수로 변환

16진수는 0~9, A~F 총 16개가 있는데 2진수로 표현하려면 4bit가 필요하다.
그래서 16진수는 2진수 4자리 수로 다 표현이 가능한데, 이걸 자유자재로 바꾸는 연습이 필요하다.
0001 : 1, 0010 :2 , 0100:4, 1000:8 이란 걸 생각하면 암산해서 금방 만들 수 있다.
ex)
A는 10이니
8+2 -> 1000+0010 = 1010(2) = A(16)

 

16진수 표기에 따른 메모리 계산

연산자(=)는 최소 1바이트 값을 읽고 씀.
0xA를 변수에 대입하면 A는 1010이니, 4비트만 차지함.. 나머지 4비트는 0이 차지해서
변수에는 0000 1010 이 들어가게 됨.

unsigned short i = 0xA;

이건 2바이트인 i에 A를 넣으면 4비트만 들어가기 때문에
0000 0000 0000 1010 이렇게 저장됨.

 

글을 마음대로 배포하셔도 되지만, 출처(링크)는 반드시 남겨주시기 바랍니다.

'C언어' 카테고리의 다른 글

C언어 지역 변수/전역 변수  (0) 2021.03.12
C언어 반복문/시프트 연산자/비트 연산자  (0) 2021.03.11
C언어 연산자/조건문  (0) 2021.03.11
C언어 함수/표준출력함수  (0) 2021.03.11
C언어와 프로그램  (0) 2021.03.10
댓글