본문 바로가기

C-programing/C언어 기초

[C언어 기초] printf(), scanf(), ASCII와 정수 8진수 16진수

>printf(), scnaf()

 

C언어에는 여러 함수가 있지만, 단연 돋보일 수 있는 함수는 printf(), scanf() 함수일 것이다. 전에 포스팅에서 설명한 바와 같이, 위 두 함수는, 입출력 함수로 include 파일에 있는 stdio.h 헤더파일에 있는 함수이다. 입력할 때, scanf()를 쓰고 출력할 때는 printf()함수를 이용하여 쉽게 프로그래밍 할 수 있다.

 

C언어 처음 입문할 때, 여러 정의를 배우고나서 접하는 함수 printf(), scanf()함수. 쉽게 코딩할 수 있고, 문법도 어렵지 않아서, 정작 중요한 몇 가지 사항들이 잊혀지는 경우가 있다. 이 포스팅을 통해 컴퓨터 언어가 어떻게 두 함수로 인해 호환이 가능한지 이야기 하려한다. 인간의 언어인 문자, 숫자가 컴퓨터 언어인 2진, 8진, 16진으로 어떻게 변환이 되고, 이것이 메모리에 저장되어 다시 출력되는 과정을 절차적으로 설명하려는 것이다.

 

 

 

 

 

> printf(), scanf() 함수의 2진, 6진, 16진수

 

설명을 용이하게 하기 위해, 27(10진수)를 예로 들겠다.

 

27(10진수)의 8진수

= 33

27(10진수)의 16진수

= 1b

-진수를 변환하는 과정은, 10진수를 2진수로 바꾸고, 2진수에서 다시 원하는 진수로 변환하면 된다.

-27은 이진수로, 11011이다. (27을 2로 나누어 생기는 나머지수를 거꾸로 배열한 것이 2진수이다.)

-11011은 8진수로, 33이다. 11011은 16진수로 1b이다. 변환하는 과정을 잘 모르겠다면, 인터넷 검색하세요.

 

 

왜 2진 8진 16진수를 신경써야 하는걸까. 이는 이것들이 컴퓨터 언어이기 때문이다. 우리가 코딩할 때, 넣는 문자와 숫자는 모두 0과 1로 이루어진 신호적 의미로 재해석된다. 쉽게 말하면, 우리의 언어를 컴퓨터 언어로 잇는 매개체가 있어서 문자를 코딩해도 알아서 해석하고 저장한다는 것이다. 여기서 매개체는 무엇일까.

 

- ASCII 코드이다. ASCII 코드는 컴퓨터가 문자를 인식할 수 없기 때문에, 문자를 컴퓨터가 알아들을 수 있도록 해주는 지표이다. ASCII 코드는 사람의 언어 문자와 특수 문자, 그리고 숫자가 10진수, 16진수로 다시 표현되어 있다. 하나의 약속으로, 코딩에서 해당 문자가 입력 되면, 컴퓨터는 ASCII코드 매개체를 이용하여, 지정된 2진수를 취하는 것이다.

 

 

 

>자료형을 신경써야 한다. printf(), scnaf()함수는 자료형에 민감하게 반응해야 한다.

 

- 정수형 (int , char) 과 실수형 (double)

(대표적인 것만 설명하겠다. c언어는 4바이트, 8바이트를 기본단위로 프로그램을 만들었기 때문에, 굳이 2바이트, 6바이트인 자료형은 쓸 필요가 없다.)

 

 

 

여기서 int (4 byte) 형은 보이는 바대로, 정수형이다. -2147483648~ +2147483647 까지 소수점 없는, 정수를 표현하는 범위이다. 변수에 대해서 포스팅 할 것이지만, 우선 기본 자료형을 알아야, printf(), scnaf()에 대해서 제대로 이해할 수 있다.

 

char (1 byte) 형은 정수형에서 문자를 담는 자료형이다. -128~ +127까지 담을 수 있다. 위의 예처럼, 문자 단위로 표현된다.

 

double (8 byte) 형은 실수형으로 유리수를 담는 자료형이다. 범위는 굳이 표현하지 않아도 많은 양을 담기 때문에 생략하겠다.

 

 

- 위와 같은 자료형들이 왜 printf(), scanf() 함수에 중요한 것일까? printf(), scanf()는 출력, 입력할 때의 인간의 언어를 자료형에 따라 구분하여 메모리에 저장을 하기 때문이다. 예를 들면, printf()에서 %d로 출력하겠다 하면 입력된 값이 무엇이든간에, 10진수로 변환이 되어 출력이 된다. 또, %x로 출력하겠다하면 10진수로 입력이 되어 있던 값도 16진수로 변환 되어서 출력 된다. scanf() 함수는 %x로 메모리에 저장하겠다 하면, 프로그램 개발자가 27이라는 숫자를 10진수로 입력하려고 했어도 당연히, 16진수로 인식해 저장한다.

 

 

 

 

 

-printf("%x", a);

a=27 이라는 10진수를 16진수로 출력하겠다.

 

-printf("%o", a);

a=27이라는 10진수를 8진수로 출력하겠다.

 

-scanf("%x", &b);

입력되는 값은 b의 주소 위치에 저장하겠다. 그 입력 값은 그대로 16진수로 저장된다.

 

-printf("%d", b);

b라는 변수에 저장된 16진수의 값을 10진수로 바꾸어 출력하겠다.

 

 

C언어를 공부하면서 아주 기초적인 문법인데, 가끔 진수 변환이 헷갈릴 때가 있다. 그것은, printf()와 scanf()가 어떻게 변수에 저장이 되고, 어떤 식으로 출력이 되는지 완벽하게 이해하지 못했기 때문이다. 입력은, 변수 앞에 &가 붙어있다 이것은, 변수의 주소가 가리키는 위치에 해당 변수의 데이터 값을 저장한다는 의미이다. 이때, %~은 그 데이터값의 자료형을 정의해서 메모리에 저장하게 된다. 또, printf() 함수는 자료형을 따료 표시하기 위해, %~ 식으로 해당 변수의 자료형을 표시하는 것이다. 이 뒤에 변수에 대해서 포스팅할 때, 주소에 대해서 언급할 것이지만, 이번 포스팅에서 scanf() 함수의 & 의미를 유념하는 것은 기초 문법을 이해하는데 도움이 될 것이다.