<PROGRAMMING LANGUAGE>/c

Do it! c언어 입문 독학 2일차

dlrudwo 2023. 7. 29. 17:40

Do it! c언어 입문 이라는 책을 보면서 혼자 공부하는 시간을 가져보자.  이 내용들은 모두 이 책에 기재되어 있다.

<책 출처>

김성엽. 『Do it! C언어 입문』. 이지스퍼블리싱(2018)

<3장: 자료형>

데이터를 저장하는 공간, 메모리

메모리의 최소 저장 단위는 비트로, 1비트는 0, 1 중에서 한 개를 저장할 수 있는 크기이다.

저장 단위가 1비트 증가할 때마다 저장 단위는 2배로 늘어난다.

1비트는 숫자 2개 중 하나, 2비트는 4개 중 하나, 3비트는 8개 중 하나를 저장할 수 있는 크기다.

비트가 8개 모이면 새로운 단위를 사용하며 이것을 바이트(Byte)라고 한다. 1바이트는 비트 8개로 이루어지기 때문에 숫자 256개 중 하나를 저장할 수 있는 크기이다.

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

1바이트를 기준으로 살펴보면 비트 8개에 모두 숫자를 저장하는 것이 아니라 1개에는 음수 또는 양수인지의 상태를 저장하고 나머지 7개의 비트에 숫자를 저장한다.

문자를 숫자로 표현하는 약속, 아스키코드

컴퓨터에서 문자를 숫자로 약속해서 전송을 하게끔 만든 것이 아스키 코드이다. 아스키코드는 인터넷에 쳐보면 더 자세하게 나와있다. 찾아보도록 하자.

자료형의 종류

메모리를 사용할 때 몇 바이트의 메모리를 사용할 것인지를 명시해야 하는데, 이것을 데이터 타입 또는 자료형이라고 부른다.

정수를 표현하는 자료형

C언어에서는 정수 값을 저장하는데 1바이트, 2바이트, 4바이트 크기의 자료형을 제공한다.

1. signed char: 부호가 있는 1바이트 저장 공간

→ -128~127의 숫자 중 하나를 저장할 수 있는 크기

signed char temperature;
temperature = -2;   /* 영화 2도를 temperature 변수에 저장 */

2. unsigned char: 부호가 없는 1바이트 저장 공간

→ 2^8의 숫자 중 하나를 저장할 수 있는 크기

unsigned char age;
age = 52;  /* 나이 52살을 age 변수에 저장 */

3. signed short int: 부호가 있는 2바이트 저장 공간

→ -2^15~2^15-1(-32768~32767)의 숫자 중 하나를 저장할 수 있는 크기

signed short int dday;
dday = -20;   /* d-day가 20일 남았다고 dday 변수에 저장 */

4. unsigned short int: 부호가 없는 2바이트 저장 공간

→ 2^16의 숫자 중 하나를 저장할 수 있는 크기

unsigned short int seconds;
seconds = 35000;   /* 3만 5000초를 seconds 변수에 저장 */

5.signed long int: 부호가 있는 4바이트 저장 공간

→ -2^31~2^31-1의 숫자 중 하나를 저장할 수 있는 크기

signed long int money;
money = 7000000;  /* 700만원을 money 변수에 저장 */

6. unsigned long int: 부호가 없는 4바이트 저장 공간

→ 2^32의 숫자중 하나를 저장할 수 있는 크기

unsigned long int time_seconds;
/* 1970년 1월 1일부터 현재까지 흐른 시간을 초 단위로 환산한 값을 time_seconds 변수에 저장 */
time_seconds = 1453100624;

부호가 있어야 하는, 즉 양수와 음수 둘 다 사용해야 한다면 signed를 사용하고, 그것이 아니라면 unsigned를 사용한다.

또한 정수 자료형은 주로 생략한 상태를 사용하는데, signed char = char이라고 사용한다. 소스 코드에 char라고만 적혀 있다면 앞에 signed라는 예약어가 생략된 것이라고 판단하면 된다.

원래 형태 생략한 형태 가장 자주 쓰이는 형태
signed short int short int (부호를 생략) short
  signed short (int를 생략)  
  short ( 부호와 int를 생략)  
unsigned short int unsigned short (int를 생략) unsigned short
signed long int long int (부호를 생략) int
  signed long (int를 생략)  
  signed int (기본 단위 long을 생략)  
  long (부호와 int를 생략)  
  int (부호와 기본 단위 long을 생략)  
unsigned long int unsigned int (기본 단위 long을 생략) unsigned int
  unsigned long (int를 생략)  

 

실수를 표현하는 자료형

실수를 표현하는 부동소수점 방식에는 float와 double이 있다.

프로그래밍 언어에서 사용하는 실수는 IEEE754 규약에 정의된 부동소수점 표현이다. C언어에서는 32비트 크기의 부동소수점 표현을 사용하는 float 자료형과 64비트 크기의 부동소수점 표현을 사용하는 double 자료형을 제공한다.

여기서 부동소수점이란??

실수를 표현할 때 소수점의 위치를 고정하지 않고 소수점의 위치를 나타내는 수를 따로 적는 방식이다.

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

이 자료형은 메모리 공간을 가수부와 지수부로 나누어 실수 형태의 값을 저장하며 저장할 수 있는 값의 범위는 1.2E-38~3.4E38이다.(2^-126~2^128)

이 자료형은 32비트 기반이기 때문에 int와 저장 범위는 같지만 정수부와 소수부를 모두 저장해야 하기 때문에 소수점 이하 숫자가 6자리 밖에 안된다. 따라서 그 범위를 넘어가면 잘못된 값이 출력된다.

float pi;
pi = 3.141592654;
출력값: 3.141592741;

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

이 자료형도 메모리 공간을 가수부와 지수부로 나누어 실수 형태의 값을 저장 하며 저장할 수 있는 값의 범위는 2.2E-308~1.8E308이다.(2^-1022~2^1024)

이 자료형은 64비트를 기반으로 하기 때문에 소수점 이하 14자리까지 안전하게 저장 가능하다

double pi;
pi = 3.141592654;
출력값: 3.14159465400000;

<4장: 상수와 변수>

상수는 프로그램을 실행할 때 한 번 값이 결정되면 프로그램이 끝날 때까지 다른 값으로 바뀌지 않는 정보를 말한다.

숫자형 상수

숫자형 상수는 프로그램에서 가장 기본적인 형태의 상수이며 정수형 상수와 실수형 상수로 나뉜다.

실수형 상수는 가수부와 지수부 형식으로도 표현이 가능하다.

C언어 프로그램에서 숫자형 상수는 다음과 같이 쓰인다.

unsigned int num = 4500; /* 정수형 상수 4500을 부호가 없는 int 자료형 num 변수에 저장함 */
float a = 0.17;  /* 실수형 상수 0.17을 float 자료형 a 변수에 저장함 */

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

C언어에서는 10진수 형식뿐만 아니라 8진수나 16진수 형식으로도 표현할 수 있다.

1. 8진수

10진수 형식의 숫자와 구별하기 위해 8진수 형식의 숫자를 적을 떄는 숫자 앞에 0을 붙인다.

0~7의 숫자로 구성되야 하므로 8이나 9가 들어가면 오류가 뜬다.

 

2. 16진수

16진수 형식으로 표현할 때는 숫자 앞에 0x 또는 0X를 붙여서 적는다.

16진수는 각 자리마다 0~9, A~F로 이루어진 총 16개의 숫자와 문자를 사용한다.

10진수 8진수 16진수

문자형 상수

프로그램에서 문자를 표시할 때 사용하는 문자형 상수는 작은따옴표를 사용해 표현하며 영문자, 숫자형 문자, 특수문자로 구분된다.

C언어 프로그램에서 문자형 상수는 다음과 같이 쓰인다.

char key = 'A';  /* A의 아스키 값 65를 변수 key에 저장 */
char next = 'A' + 1;  /* 

문자열형 상수

문자열형 상수는 프로그램에서 문자열을 표시할 때 사용하며 “” 큰따옴표로 묶어서 표현한다.

일반적으로 문자 하나는 1바이트를 차지하기 때문에 “Hello~”라고 적으면 6바이트를 차지할 것이라고 생각하겠으나, 문자열은 자신의 끝을 표시하기 위해 마지막 자리에 ‘비어있다’를 의미하는 0 값이 추가가 되므로 7바이트이다.

 

데이터 저장 공간, 변수

변수는 변하는 값이며, 프로그래밍에서는 두 가지 의미를 가진다. 첫 번째는 프로그램이 실행되는 동안 지속적으로 값이 바뀌는 정보를 말하고, 두 번째는 사용자로부터 데이터를 받거나 처리하려면 저장할 공간이 필요한데, 이러한 저장 공간을 뜻한다.

 

변수이름

  • 변수 이름은 영문자 a~z, A~Z, 숫자 0~9 그리고 _(밑줄)을 조합해 구성할 수 있다. 하지만 모두 숫자로 구성하거나 숫자로 시작하는 문자열은 변수 이름으로 사용할 수 없다.
  • 변수 이름은 공백을 포함할 수 없다.
  • 변수 이름은 대 소문자를 구별하기 때문에 같은 단어여도 서로 다른 변수 이름으로 처리된다.

변수 선언하기

변수는 자료형 - 변수이름 - 구분자(;) 순으로 선언을 해준다. 그리고 같은 자료형으로 여러 개의 변수를 선언할 때는 쉼표를 사용해 한 줄로 선언도 가능하다.

 

변수 초기화하기

변수를 선언했을 때 변수에는 초기값이 정해져 있지 않기 때문에 쓰레기 값이 들어가 있다. 이 값 대신에 자신이 사용하고 싶은 값을 메모리에 저장하는 행위를 초기화라고 한다.

int value; /* 4바이트 크기의 value 변수에 어떤 값이 저장되어 있는지 알 수 없음 */
int value = 0; /* 4바이트 크기의 value 변수에 정수형 상수 값 0을 넣어 초기화함 */

이렇게 선언하면 부호를 고려하는 4바이트 크기의 메모리가 할당되며 그 이름은 value이고 해당 메모리에 정수 값 0을 넣어 초기화하겠다는 뜻이다.

#코딩해 보기#

2진수를 16진수로 변환하는 방법

16진수의 한자릿수는 4비트를 의미한다. 따라서 만약 16진수 BC는 각각 4비트씩 총 8비트로 표현한다.

이런 식으로 2진수와 16진수는 4비트 단위로 나누어서 쉽게 변환이 가능하다.

ex) 16진수 형식인 0xC값은 10진수 12를 의미하고 12는 4+8과 같은 값이기 때문에 0100+1000 값과 같다. 따라서 1100이 되며, 16진수 C값과 일치하는 것을 볼 수 있다.

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

결국 C언어에서 0x2E라고 표기된 16진수 값을 메모리에 저장하기 위해서는 최소한 1바이트가 필요하다. 16진수를 0xA처럼 한 자릿수만 적더라도 대입 연산자는 최소 1바이트 단위로 값을 읽고 쓰기 때문에, 표기된 숫자는 4바이트만 사용하지 못하고 0x0A값으로 저장된다.

short int data = 0xA; /* short int가 2바이트 메모리를 차지하기 때문에 0x000A라고 적은 것과 같다. */