728x90

데이터형을 나타내는 키워드

변수와 상수
컴퓨터는 프로그램이라는 것을 이용해서 많은 일을 합니다. 수를 더하고, 스피커 또는 화면을 출력하거나, 전화를 거는 등 이외에도 독자가 생각할 수 있는 모든 일을 할 수 있습니다. 이러한 일들을 하기 위해서는 프로그램이 정보를 담고 있는 수와 문자들 즉, 데이터를 가지고 작업해야 합니다. 어떤 종류의 데이터는 프로그램이 사용되기 전에 값이 미리 정해지며, 프로그램이 실행되는 동안 그 값이 변하지 않고 유지됩니다. 이러한 데이터를 상수(constant)라 합니다. 상수와는 달리 프로그램이 실행되는 동안 대입되거나 연산 등을 통해서 값이 변하는 데이터를 변수(variable)라 합니다.

예제 3-1 프로그램에서 cm은 변수이고, 12.54는 상수입니다. 프로그램에서 변수와 상수의 차이는 프로그램이 실행되는 동안 값이 변하거나 대입될 수 있으면 변수이고, 그렇지 않다면 상수입니다.


키워드
변수와 상수를 구별하는 것 외에도 서로 다른 종류의 데이터를 구별할 수 있어야 합니다. 어떤 데이터가 숫자이고, 어떤 데이터가 문자인지 말이죠. 컴퓨터는 서로 데이터의 종류가 서로 다르다는 것을 알지 못하기 때문에 이것을 구별해주는 방법이 있어야 합니다. C는 이 일을 하기 위해 몇 가지 기본적인 데이터형을 제공하고 있습니다. 만약 데이터가 상수라면, 컴파일러는 표시된 모양 그대로의 데이터를 데이터형으로 인식하기 때문에 문제가 되지 않습니다. 즉 10은 정수, 10.10은 부동소수점 수로 인식합니다. 하지만 변수는 선언문을 통해 그것의 데이터형이 무엇인지를 미리 알려주어야 합니다.

이제 곧 변수를 선언하는 방법에 대해서 자세히 알아볼 것입니다. 하지만 그 전에 먼저 C가 인식하는 기본적인 데이터형들에 대해 살펴봅시다. K&R C는 데이터형과 관련해서 7개의 키워드를 인식했고, C90 표준에서 2개가 더 추가되었습니다. 그리고 C99 표준에서 3개가 추가되었습니다.

 K&R C 키워드 

 C90 키워드

 C99 키워 

 int

 signed 

 _Bool 

 long 

 void 

 _Complex 

 short 

  

 _Imaginary 

 unsigned 

 

 

 char 

 

 

 float 

 

 

 double

 

 

int 키워드는 C가 사용하는 정수 데이터의 기본 자료형입니다. 그다음, 3개의 키워드(long, short, unsigned)와 C90에서 추가된 signed 키워드는 그 기본형의 변형(unsigned short int, long long int)들을 제공하기 위해 사용됩니다. 그다음, char 키워드는 알파벳 문자와 #, $, %, ^와 같은 기타 문자들을 표현하기 위해 사용하는 데이터형입니다. 또한 char형은 작은 정수들을 나타낼 때도 사용할 수 있습니다. 다음 float, doublelong double 조합은 소수점이 있는 수를 나타낼 때 사용됩니다. _Bool형은 부울값(truefalse)를 나타낼 때 사용되고, _Complex_Imaginary는 각각 복소수와 허수를 나타낼 때 사용됩니다.

이러한 키워드들에 의해 만들어지는 데이터형은 컴퓨터에 어떻게 저장되는지에 따라 크게 정수형과 부동소수점형으로 분류됩니다.


비트, 바이트, 워드

비트(bit), 바이트(byte), 워드(word)는 컴퓨터 데이터 단위를 표시하는 데 또는 컴퓨터의 메모리 단위를 표시하는 데 사용됩니다. 여기에서는 두 번째 용도에 대해 설명하겠습니다.

메모리 단위의 가장 작은 단위를 비트(bit)라고 합니다. 비트는 0 또는 1 두 값 중 하나만 저장할 수 있습니다. 1bit에 많은 정보를 저장할 수는 없지만, 컴퓨터에는 엄청난 양의 비트들이 쌓여있습니다. 비트는 컴퓨터 메모리의 기본 구성요소입니다.

바이트(byte)는 컴퓨터 메모리의 통상적인 단위입니다. 거의 모든 컴퓨터에서 1byte는 8bit로 정의되어 있습니다. 각 비트는 0이나 1 둘 중 한 값만을 가질 수 있으므로, 8bit로 구성된 1byte는 0과 1로 구성된 비트 패턴을 256(28)개 나타낼 수 있습니다. 0과 1로 이루어진 2진 코드로 구성된 패턴들은 0에서 255까지의 정수들을 나타내거나 문자 집합을 나타내는 데 사용할 수 있습니다.

워드(word)는 특정 컴퓨터를 설계할 때 정해지는 고유 메모리 단위입니다. 예를 들면, 8bit 마이크로컴퓨터에서 워드는 8bit였지만, 그때 이후로 컴퓨터들은 16bit 워드, 32bit 워드, 그리고 현재는 64bit까지 발전했습니다. 워드의 크기가 크다는 것은 데이터를 빠르게 옮길 수 있고 많은 메모리에 접근할 수 있다는 것을 의미합니다.


정수형과 부동소수점형
정수형(integer type)과 부동소수점형(floating-pointer type) 이런 익숙하지 않은 용어들 때문에 머리가 복잡하다면, 마음을 편히 가지세요. 지금부터 이 용어들의 의미를 간단히 알아볼 것입니다. 만약 비트, 바이트, 워드라는 용어들을 처음 들어본다면 위의 설명글을 읽어주세요. 이 용어들에 대해 하나부터 열까지 자세히 알 필요는 없습니다. 자동차를 운전하기 위해 내연기관의 원리까지 알 필요가 없는것처럼 말이죠. 하지만 엔진의 작동원리나 컴퓨터의 내부구조에 대해 알아두면 가끔 도움이 될 때도 있습니다.

사람의 경우에는 정수와 부동소수점 수의 차이는 수를 적는 방식에 있지만, 컴퓨터의 경우에는 저장되는 방식에 있습니다. 두 가지 유형을 차례로 살펴보도록 합시다.

정수
정수(integer)는 소수부가 없는 수이기 때문에 C에서는 정수에 소수점을 적으면 안 됩니다. 즉 10, 5, -52는 정수이고 0.1, 5.0, 3.14는 정수가 아닙니다. 정수는 2진수의 형태로 저장되는데, 예를 들면 7은 2진 코드 111로 저장이 됩니다. 따라서 정수 7을 8bit 워드에 저장하면, 앞의 5bit는 0으로 설정되고, 마지막 3bit가 1로 설정됩니다.

부동소수점 수
부동소수점 수(floating-point number)는 수학에서 말하는 실수(real number)와 어느 정도 비슷합니다. 실수는 정수와 정수 사이에 들어 있는 수들을 포함합니다. 몇 가지 예를 들면 2.75, 3.14, 5.00, 2e-8이 부동소수점 수입니다. 어떤 값에 소수점을 붙이면 부동소수점 값이 되기 때문에 5는 정수형이지만, 5.00은 부동소수점형이 됩니다. 부동소수점 수를 표기하는 방법은 여러 가지가 있는데 e 표기에 대해서 간단히 설명해보면 3.14E7은 3.14에 10의 7승을 곱한 수입니다. 여기서 7을 10의 지수(exponent)라고 부릅니다.

여기서 중요한 것은, 부동소수점 수를 저장하는 방법이 정수와는 다르다는 것입니다. 부동소수점수는 소수부(fractional part)와 지수부(exponent part)로 나누어서 따로 저장합니다. 그러므로 값은 같더라도 부동소수점수 7.00은 정수 7과는 다른 방법으로 저장됩니다. 또, 7.0은 0.7E1(0.7 * 10의 1승)이라 적을 수도 있습니다. 여기서 0.7이 소수부이고 1이 지수부입니다. 아래 그림은 부동소수점수를 저장하는 또 다른 예를 보여줍니다. 물론 컴퓨터 내부적으로 저장할 때는 10의 지수가 아닌 2의 지수와 2진수를 사용합니다. 이 주제에 대해서는 비트 조작을 배울 때 더 자세히 설명할 것입니다.

  • 정수는 소수부가 없습니다. 부동소수점 수는 소수부를 가질 수 있습니다.
  • 부동소수점 수는 정수보다 훨씬 큰 범위의 수를 나타낼 수 있습니다.
  • 부동소수점 수의 연산과정에서 데이터의 손실이 일어날 수 있습니다.
  • 어떤 범위에 들어있는 실수의 수는 무한하여서, 컴퓨터는 그 범위에 있는 모든 값을 부동소수점 수로 나타내지 못합니다. 부동소수점 값들은 흔히 실제 값의 근삿값입니다. 예를 들면, 7.0은 6.999999 float 값으로 저장될 수도 있습니다.
  • 일반적으로 부동소수점 수 연산은 정수 연산보다 느립니다. 하지만 오늘날의 CPU들은 그 속도 차이를 극복하는 부동소수점 프로세서를 채용하기도 합니다.


728x90
728x90