C 언어 | C 언어 입문 | 상수

숫자나 문자 등의 고정 데이터를 소스 코드에 작성하는 방법을 설명한다.

접미사

100와 같은 숫자나 큰 따옴표로 둘러싸인 문자열 등을 총칭하여 상수라고 한다. 사실, 상수도 변수와 같은 형태가 존재한다. 상수를 변수에 할당하는 경우, 물론 상수는 변수의 형에 대해 호환이 되어야 한다.

숫자를 나타내는 상수는 부동 소수점 상수 및 정수 상수로 나누어 진다. 숫자만의 경우, 컴파일러는 int형의 정수 상수로 판단하고, 소수점이 발견되면 double형 상수로 처리한다. 그러나 이것으로는, float와 long double, long형 등의 상수를 표현할 수 없다. 그래서 C 언어에서는 정수 형을 명시하기 위해 숫자의 끝에 형태를 나타내는 알파벳을 지정한다. 이를 접미사라고 한다. 정수 상수로 지정할 수 있는 접미사는 표1 중에 하나이다.

표1 정수 접미사

접미사 기입 예
l 또는 L 상수의 크기에 따라 long int 또는 unsigned long int 123456789L
u 또는 U 상수의 크기에 따라 unsigned int 또는 unsigned long int 123456789U
l 또는 L과 u 또는 U unsigned long int 123456789UL

이러한 접미사를 정수 상수로 지정하여, 정수 형을 명시할 수 있다. 마찬가지로 부동 소수점 상수도 float, double, long double 여부를 지정하는 접미사가 존재한다. 부동 소수점 상수는 표2 중 하나의 접미사를 지정할 수 있다.

표2 부동 소수점 상수 접미사

접미사 기입 예
f 또는 F float 3.14F
l 또는 L long double 3.14L

일반적으로 접미사를 지정하지는 않지만, 정수 형을 컴파일러에게 전하고 싶은 경우에 접미사를 사용한다. 예를 들어, 부동 소수점 상수는 기본적으로 double형으로 인식되기 때문에 float형 변수에 부동 소수점 상수를 대입하면 컴파일러가 경고를 발생시킨다.

코드1

#include <stdio.h>

int main() {
  float fVar = 3.14F;
 printf("%g\n" , fVar);
 return 0;
}

코드1은 float형 변수 fVar에 3.14이라는 float형의 부동 소수점 상수를 대입하고 있다. 이 때 상수 끝에 접미사 F를 이용하고 있는 것에 주목하자. 이를 제외하면 컴파일러는 값을 일부를 잘라내어 작게 할 수 있음을 경고한다. 그래서 프로그래머는 이 상수가 float형임을 증명하고 안전하게 float형 변수에 대입할 수 있는 것을 접미사를 사용하여 어필할 수 있다.

상수의 다양한 작성

부동 소수점도 정수도 보통은 특별히 의식하지 않고 직관적인 작성해도 상관없다. 0.5이라고 쓰면 부동 소수점 상수이고, 소수점이 없는 숫자라면 정수로 인식되기 때문이다. 그러나 부동 소수점도 정수도, 이외의 표현 방법이 몇개가 있기에 소개하도록 하겠다.

부동 소수점 상수는 정수부, 소수부 지수로 나누어져 있다. 정수 부분과 소수 부분은 그 중 한 방향를 생략할 수 있지만, 양 방향을 동시에 생략할 수는 없다. 다만, 지수 표기를 사용하면 생략할 수 있다. 지수는 e 또는 E 뒤를 이어 값을 지정한다.

부동 소수점은 가수 × 기수 지수로 계산되기 때문에 지수를 지정하면 정수 부분을 지정할 필요가 없는 것이다. 예를 들면 3.14 값을 부동 소수점 상수로 표현하는 경우 몇 가지 표현 방법이 있다.

코드2

#include <stdio.h>

int main() {
 float fVar1 = .314e1F;
  float fVar2 = 314e-2F;
  float fVar3 = 31.4e-1F;
 printf("fVar1 = %g\nfVar2 = %g\nfVar3 = %g\n" , fVar1 , fVar2 , fVar3);

  return 0;
}

코드2는 3개의 float형 변수를 부동 소수점 상수로 초기화한다. 이러한 부동 소수점 상수는 모두가 3.14라는 값이다. 그러나 소스를 보고 확인할 수 있도록 표현은 모두 다르다. 따라서, 부동 소수점 상수는 같은 값이라도 다양한 표현을 할 수 있으므로 알아두면 좋다.

정수는 10진수 외에 8진수와 16진수를 사용할 수 있다. 2진수를 의식해야 하는 숫자 데이터를 처리할 경우는 10진수를 사용하는 것보다 편리하다. 특히 16진수는 실제 프로그래밍에서도 많이 하는 경우가 많기 때문에 중요하다. 예를 들어 ARGB 형식의 32비트 색상 데이터를 나타내는 경우, 각각의 1바이트의 요소를 16진수로 지정하면 알기 쉽고 편리하다.

정수를 8진수로 지정하려면 숫자 앞에 0을 16진수로 지정하는 경우 0x 또는 0X를 지정한다. 16진수의 경우, A ~ F까지의 숫자는 대문자여도 소문자이어도 상관없다.

코드3

#include <stdio.h>

int main() {
  printf("0xFF = %d\n0377 = %d\n" , 0xFF , 0377);
 return 0;
}

16진수 0xFF 및 8진수 0377은 모두 10진수로 255값이다. 예상대로 코드3을 실행하면 모두 10진수로 255이라는 값을 출력한다. 특히 2자리의 16진수와 8자리의 2진수(8비트)과 동일하므로 비트 연산 등에 사용할 수 있다.

문자 상수

ASCII 문자 세트는 1개의 영숫자 문자를 1바이트로 표현한다. ASCII 코드는 많은 컴퓨터가 지원하는 표준 문자 코드이다. C언어의 문자 상수는 즉, 1바이트의 ASCII 코드라는 것이다. ASCII는 American Standard Code for Information Interchange의 약자로, ANSI는 1962년에 제정한 표준 코드이다. 실제로는 7비트로 구성되어 있고, 영문자와 기호나 숫자 등을 표현할 수 있다.

문자 상수는 따옴표(’)에 문자를 지정한다. char형의 변수에 문자를 할당하는 경우 이러한 문자 상수를 지정한다. char형에 숫자를 대입 할 수 있지만, 1바이트라는 성질에서 문자를 표현하기에 적합하다. 문자 상수로 나타낼 수 있는 것은 항상 1문자이자만, 이스케이프 문자를 지정할 수 있다. 이스케이프 문자를 지정한 경우 \n처럼 두 글자로 보이지만 실제로 나타내고있는 것은 한 문자 이스케이프 문자이다.

그런데, 중요한 것은 컴퓨터는 문자를 숫자로 취급하고 있다. 예를 들면 ASCII 코드 ‘A’는 16진수 0x41에 해당하며, ‘B’는 0x42, ‘C’는 0x43와 같이 일련 번호로 되어 있다. 즉, 소스 코드로 문자 상수를 지정하여도 실제로는 수치로 취급한다. 이것을 이해하면 컴퓨터에서 문자라는 것이 어떻게 다루어지고 있는지, 그 원리를 배울 수있을 것이다.

#include <stdio.h>

int main() {
 char chVarA = 'A';
  char chVarB = 0x42;

 printf("chVarA(%%X) = %X\nchVarA(%%c) = %c\n" , chVarA , chVarA);
 printf("chVarB(%%X) = %X\nchVarB(%%c) = %c\n" , chVarB , chVarB);

 return 0;
}

코드4를 실행하면, 매우 흥미로운 결과가 표시된다.

이 프로그램은 char형 변수 chVarA과 chVarB이 포함된 숫자와 문자 표현을 표시한다. chVarA에는 이니셜라이저에서 ‘A’라는 문자 상수를 대입하고 있지만, 앞에서 설명한대로 이 값을 16진수로 출력하면 41이라는 결과를 얻을 수 있다. chVarB는 16진수 42이라는 정수를 할당하고 있다. 마찬가지로 이 변수를 출력하면 숫자는 당연히 42을 출력하지만, 문자로 표시하면 B라는 결과가 된다. 방금 전의 ASCII 코드 A에 이어지고 있는 것을 알 수 있다.

이와 같이, 1문자는 문자 상수로 지정할 수 있지만, 실제로는 숫자로 취급할 수 있는 것이다. 여기서 하나 주의를 해야 하는 것은, 리터럴 문자열 ““와 문자 상수 ‘‘는 근본적으로 다른 종류로 인식한다. “A"와 ‘A’는 다르다.

이스케이프 문자

문자열이나 문자 상수는 \ 기호로 시작하는 이스케이프 문자를 지정할 수 있다. 이스케이프 문자는 줄 바꿈이나 탭 문자 등 일반 문자로 표현할 수 없는 표현이 어려운 문자 코드를 나타낼 수 있다. 이스케이프 문자는 표3과 같은 것이 있다.

표3 이스케이프 문자

기호 의미
\a 벨 문자 (경고)
\b 한 칸 뒤로
\f 페이징 (일반)
\n 개행 복귀
\r 같은 줄의 맨 위로
\t 수평 탭
\v 수직 탭
\ \보기
? ?보기
' 따옴표 (’)를 표시
" 큰 따옴표 (")를 표시
\0
\N 8진수 정수 (N은 8 진수 상수)
\xN 16진수 정수 (N은 16 진수 정수)

예를 들어, 문자열에 큰 따옴표를 사용하려는 경우와 문자 상수에서 따옴표를 표현하거나 \ 기호 또는 탭 문자 등을 표현하고 싶은 경우에 이러한 이스케이프 문자를 사용한다. 그러나 수직 탭 등 일부 이스케이프 문자는 특정 장치에서만 의미를 인식하지 않을 수도 있다.




최종 수정 : 2017-11-26