관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

상수와 데이터 출력 2 - 상수와 데이터 표현 방법 본문

프로그래밍 언어/C 언어

상수와 데이터 출력 2 - 상수와 데이터 표현 방법

huenuri 2024. 7. 30. 04:26

기본 문자 데이터를 출력하는 내용을 학습했으니 이제 정수, 실수, 문자와 문자열 등의 데이터를 출력하는 방법을 알아보도록 하자.

C 언어는 메모리에 직접 접근하거나 비트 단위의 연산을 수행해 데이터를 효율적으로 처리할 수 있게 해준다. 이런 장점을 잘 활용하려면 데이터가 메모리에 저장되는 방식을 알아야 한다.

 

들어가기 전에

C 언어에서 다루는 데이터에는 정수, 실수, 문자, 문자열이 있다. 데이터의 형태로는 값을 바꿀 수 있는 변수와 바꿀 수 없는 상수 2가지가 있다.

 


 
 

 

 

1. 정수 상수 표현법

정수 상수는 기본적으로 아라비아 숫자 0~9, +, - 기호를 사용한다. 이를 3가지 진법, 즉 10진수, 8진수, 16진수로 표현할 수 있다.

 

🧨 진법별 수 표현 방법

 

 

🧨 3가지 진법의 정수 상수

#include <stdio.h> 
int main(void) 
{ 
  printf("%d\n", 12); 
  printf("%d\n", 014); 
  printf("%d\n", 0xc); 
  printf("%o\n", 12); 
  printf("%x\n", 12); 
  printf("%X\n", 12); 
  return 0; 
}

 

 

2. 실수 상수 표현법

 

 

실수는 소수점 형태와 지수 형태로 표현할 수 있다. 소수점 형태로 표현할 때 실수는 아라비아 숫자 0~9, +, - 기호와 소수점을 사용한다.

 

 

정규화 표기법 : 소수점 앞에 0이 아니 유효 숫자 한 자리를 사용해 지수 형태로 바꾼 것

 

 

 

3.14e-5

 

🧨 지수 형태의 실수 상수

소수점 이하 자릿수를 지정하려면 %와 서식지정자 문자 사이에 점을 찍고 자릿수를 숫자로 쓴다. %le는 변환 문자를 사용해 지수 형태로 출력하는 것이다.

 

#include <stdio.h> 
int main(void) 
{ 
  printf("%.1lf\n", 1e6); 
  printf("%.7lf\n", 3.14e-5); 
  printf("%le\n", 0.0000314); 
  printf("%.2le\n", 0.0000314); 
  return 0; 
}

 

 

3. 문자와 문자열 상수 표현법

문자는 작은 따옴표로 묶고, 문자열은 큰 따옴표로 묶는다.

#include <stdio.h> 
int main(void) 
{ 
  printf("%c\n", 'A'); 
  printf("%s\n", "A"); 
  printf("%c은 %s입니다.", '1', "first"); 
  return 0; 
}

%c는 문자를, %s는 문자열을 출력하는 데 사용한다.

 

🧨 아스키 코드

사람이 사용하는 기호를 컴퓨터 안에서 표현하는 방법에 대해 약속한 것이다.

컴퓨터에서 필요한 128개의 문자를 코드화했으며 여기에는 영문 대문자, 소문자, 아라비아 숫자, 특수 문자, 제어 문자 등이 포함된다.

 

 

컴퓨터는 모든 데이터를 비트로 변환

비트가 8개이면 1바이트

 

 

4. 컴파일된 후의 비트 형태

 

예를 들어, 10 + 20;을 입력했다면 컴퓨터는 1, 0, +, 2, 8, ;이 모두 하나의 문자로 저장된다. 이것이 컴파일 과정이 없으면 코드가 컴퓨터에서 실행되지 않는 이유이다.

컴퓨터에서 +는 '덧셈을 하라'는 명령이 아니라 그저 문자일 뿐이다.

코드가 컴파일러를 거처 컴파일되어야 비로소 연산자는 명령어가 되고, 상수는 연산이 가능한 형태로 바뀐다. 상수는 종류에 따라 각기 다른 형태로 바뀐다.

컴퓨터는 모든 데이터를 비트로 변환하며, 데이터의 크기가 커지면 프로그램에서 사용할 수 있는 값의 크기도 커진다.

 

 

🧨 정수 · 실수 · 문자 상수의 컴파일

 

10과 10.0은 별 차이가 없이 느껴지지만, 컴퓨터는 이 둘을 다르게 인식한다. 어떤 상수를 쓰느냐에 따라 실행 속도나 정확도에서 차이가 날 수 있다. 정수는 가장 빠르고 정확하게 연산될 수 있는 형태이므로 프로그래밍할 때 가능하면 정수 상수를 사용하는 것이 좋다.

문자 상수는 소스 코드에서 문자임을 표현하는 방법이며, 컴퓨터 안에서는 정수와 같은 방식으로 처리된다.

 

 

 


 

5. 정수 상수가 컴파일된 후의 비트 형태

🧨 양수의 변환

 

정수는 10진수를 그대로 2진수로 바꾼 것이므로 1을 갖는 비트가 왼쪽에 위치할수록 값의 크기가 커진다.

 

 

그렇다면 1바이트로 정수를 표현할 때 최솟값과 최댓값은 각각 얼마일까?

 

 

 

 

데이터 크기와 상관없이 8바이트로 만들고 싶을 때는 정수에 접미사 LL 또는 소문자 ll을 붙여서 사용한다.

 

🧨 음수의 변환

음수는 절댓값을 2의 보수로 바꾸어 처리한다. 2의 보수란 2진수의 0과 1을 바꾼 상태(이 상태를 1의 보수라 함)에서 1을 더한 값을 말한다.

 

 

음수를 2의 보수로 처리하는 이유는 특별한 변환 과정 없이 바로 양수와 음수를 더할 수 있기 때문이다. 실제로 10과 -10의 모든 비트를 더하면 가장 왼쪽의 비트에서 자리 올림이 발생하고 남은 32비트는 모두 0이 되어 결과적으로 값이 0이 된다.

 

 

🧨 실수 상수가 컴파일된 후의 비트 형태

실수의 경우 제한된 데이터 크기에 수를 표현하기 위해 IEEEE 754 표준을 따른다. 이 표준에서는 single, double, quad의 3가지 형식이 있는데, 그중 가장 많이 사용하는 double 형식만 간단히 살펴보면 다음과 같다.

부호 비트 : 가장 왼쪽 비트이며 양수는 0, 음수는 1로 표시한다
지수부 : 부호 비트 다음부터 11비트는 지수값을 의미
소수부 : 나머지 52비트는 소수값을 의미

 

 

 


 

연습문제 풀기

 

자신의 학번, 이름, 학정을 출력하는 프로그램 완성하기

 

#include <stdio.h> 
int main(void) 
{ 
  printf("학번 : 202407452\n"); 
  printf("이름 : 홍길동\n"); 
  printf("학년 : 2학년\n"); 
  printf("학점 : A+\n"); 
}

책에 있는 문제를 변형해서 풀어보았다.


 

학습을 마치고

이 단원은 이전에 별로 정리된 게 없어서 책의 내용을 다시 읽으며 정리해 보았다. 여기서부터는 학습일지를 쓰기 귀찮아서 그림만 몇 개 붙여 넣었기 때문이다.

이 부분은 다 알고 있다고 생각했는데 정수만 알고 실수 상수에 대해서는 잘 모르고 있었다. 어떻게 음수를 변환하는지도..

공부하다 보면 끝이 없는 것 같다. 기초는 이것으로 충분하니 이제 넘어야지.