C언어에서 다루는 데이터에는 정수, 실수, 문자, 문자열이 있습니다. 그리고 데이터의 형태로는 값을 바꿀 수 있는 변수와 값을 바꿀 수 없는 상수 2가지가 있습니다. 이번 시간엔 상수(constant)를 알아보겠습니다.
1. 정수 상수 표현법
진법별 표현 방법
*2진수는 컴퓨터 안에서 값이 저장되는 상태로 0과 1로만 이루어져 있어 형태가 길어지므로 사용하기에 비효율적입니다.
C언어에서 진법 표현하기
위와 같이 그냥 작성하면 무슨 진수를 사용했는지 구분하기 힘듭니다. 이를 표기법을 이용해서 구분할 수 있습니다.
예시
#include <stdio.h>
int main(void){
printf("%d\n", 12);
printf("%d\n", 014);
printf("%d\n", 0xC);
return 0;
}
실행 결과
12
12
12
출력 결과를 보면 알 수 있듯이 코드 안에 진법에 따른 수의 표현법은 다르지만 값은 같으므로 결과가 모두 같다는 것을 알 수 있습니다. %o를 사용하면 8진수를, %x, %X를 사용하면 16진수를 출력할 수 있습니다.
다음은 표기법 까지 적용한 진법별 표현 방법입니다.
2. 실수 상수 표현법
소수점 형태
소수점 형태로 표현할 수 있는 방법은 다음과 같습니다.
3.4 -1.5 +10.0 .5 -10. (의미없는 0은 생략할 수 있습니다.) |
정규화(normalization) 표현
이공계열에서는 지수 표기법으로 표기합니다. C언어에도 이와 같은 표기법을 표현할 수 있는데 다음과 같이 사용할 수 있습니다.
다음은 두 표현법의 예시입니다.
#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;
}
실행 결과
1000000.0
0.0000314
3.140000e-05
3.14e-05
실행 결과에서 할 수 있듯이 출력 값을 지수 형태로 사용해도 printf 함수는 기본적으로 소수점 형태로 출력합니다. 지수 형태로 출력하려면 %le 변환문자를 사용해야 합니다.
기본적으로 소수점 이하 여섯째 자리까지만 출력되는데 이보다 많이 출력하고 싶다면 .7과 같이 적어서 잘리지 않도록 해야 합니다.
3. 문자와 문자열 상수 표현법
문자와 문자열의 표현법은 간단합니다. 문자는 작은따옴표('')로 묶고 문자열은 큰따옴표("")로 묶으면 됩니다. ex) 'A', "A"
각각 출력할 때 %c(문자), %s(문자열)을 사용합니다.
예시
#include <stdio.h>
int main(void){
printf("%c\n", 'A');
printf("%s\n", "A");
printf("%c는 %s입니다.\n", '1', "first");
return 0;
}
실행 결과
A
A
1은 first입니다.
상수가 컴파일된 후의 비트 형태
편집기에 코드를 입력하면 이 코드는 모두 컴퓨터가 이해하는 형태의 아스키 코드 값으로 저장됩니다.
ex) 10 + 20 > 1,0,+,2,0 (컴파일 과정이 없으면 코드가 컴퓨터에서 실행되지 않는 이유 : 단지 문자이기 때문에)
정수 상수와 실수 상수의 컴파일
정수 상수를 컴파일하면 4바이트, 실수 상수는 8바이트로 표현됩니다. 다음 예시를 보시죠.
10과 10.0의 차이가 느껴지나요? 우리는 타이를 못 느끼지만 컴퓨터는 이 둘을 다르게 인식하고 처리합니다. 따라서 어떤 상수를 쓰느냐에 따라 실행 속도나 정확도에서 차이가 날 수 있습니다. 정수는 가장 빠르고 정확하게 연산될 수 있는 형태이므로 프로그래밍할 때 가능하면 정수 상수를 사용하는 것이 좋습니다.
문자 상수의 컴파일
문자 상수를 컴파일하면 2진수 형태의 아스키 코드 값으로 번역이 됩니다. ex) 'A' > 65
결국 문자 상수는 소스 코드에서 문자임을 표현하는 방법이며 컴퓨터 안에서는 정수와 같은 방식으로 처리됩니다.
정수 상수가 컴파일된 후의 비트 형태
양수의 변환
위에서도 보셨듯이 정수는 2진수로 변환이 됩니다. 그리고 4바이트를 채우기 위해 남는 곳은 모두 0으로 채웁니다.
만약 값의 크기와 상관없이 데이터의 크기를 8바이트로 만들고 싶을 때는 정수에 Long Long을 의미하는 접미사 ll 또는 LL을 붙여 사용합니다. ex) 13 > 13ll, 13LL
음수의 변환
음수는 절댓값을 2의 보수로 바꾸어 처리합니다. 음수를 2의 보수로 처리하는 이유는 특별한 변환 과정 없이 바로 양수와 음수를 더할 수 있기 때문입니다. 실제로 10과 -10의 모든 비트를 더하면 가장 왼쪽의 비트에서 자리 올림이 발생하고 남은 32비트는 모두 0이 되어 결과적으로 값 자체가 0이 됩니다.
실수 상수가 컴파일된 후의 비트 형태
실수는 제한된 데이터 크기에 수를 표현하기 위해 IEEE 743 표준을 따릅니다. 그중 가장 많이 사용하는 double 형식만 간단히 살펴 보겠습니다. double은 8바이트(64비트)로 표현하며 다음과 같이 구성됩니다.
부호 비트 : 1비트로 이루어져 있으며 양수는 0, 음수는 1로 표시합니다.
지수부 : 부호 비트 다음부터 11비트는 지수값을 의미합니다.
소수부 : 나머지 52비트는 소수값을 의미합니다.