혼자공부하는 C언어 상수와 데이터 표현법
2-2 상수와 데이터 표현방법
-c 언어는 메모리에 직접 접근, 비트단위 연산 가능 -> 데이터가 메모리에 저장되는 방식 알아야 활용가능
데이터 = 프로그램이 처리하는 대상
데이터 형태 = 변수, 상수
상수 = 값이 정해져 있고 변하면 안됨(정수, 실수 , 문자 , 문자열 )
정수상수
= 0~9 +- 로 표현 10진수,8진수,16진수로 표현 가능
*진법은 수를 표현하는 방법이다.
7까지는 다 같음, 표기상 8진수는 숫자앞 0 16진수는 0x를 붙여서 표기한다.
#include <stdio.h>
int main(void)
{
printf("%d\n",12);
printf("%d\n",014);
printf("%d\n",0xc);
return 0;
}
*진법에 따라 다르게 표기한 것일 뿐 모두 같은 값임
#include <stdio.h>
int main(void)
{
printf("%o\n",12);
printf("%x\n",12);
printf("%X\n",12);
return 0;
}
10진수를 8진수나 16진수로도 출력할 수 있다.
8진수는 o, 16진수는 x , 대문자 출력은 X를 앞에 써주어 바꿀 수 있다.
실수 상수
실수 = 소수점 형태 or 지수형태로 표현 가능
*소수점 앞 0을 유효숫자 한자리를 사용해 지수형태로 바꾼것을 정규화 표기법이라 함
ex)0.0000312 -> 312e-7(e-7 = 10의 -7승)
printf 함수가 실수를 지수형태로 출력할때는 정규화 표기법을 사용
#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;
}
printf 함수는 정규화 표기법을 이용하여 출력해도 기본적으로 소수점으로 출력함
이때 쓸수 있는게 "le"
*le 를 사용하면 정규화 표기법으로 출력된다.
*1행은 1000000.0 을 지수 형태로 표현한 것
*lf 로 출력하면 소수점 이하 6자리 까지 출력됨으로 7째 자리까지 출력하려면 .7lf 로 늘려주어 유효숫자가 잘리지 않도록 함
*소수점 위치 표현 0 제외한 모든 수가 유효숫자다.
*소수점 이하 자릿수 지정은 마찬가지로 .2le
문자와 문자열 상수 표현법
-문자는 작은 따옴표 ' ' 로 묶고 문자열은 큰따옴표 ""로 묶는다.
#include <stdio.h>
int main(void)
{
printf("%c\n",'A');
printf("%s\n","A");
printf("%c은 %s입니다.\n", '1',"first");
return 0;
}
*"A"는 하나의 문자라도 "" 로 묶여있으니 문자열로 취급한다.
*문자는 %c변환문자를 , 문자열은 변환문자 없이도 출력할 수 있으나 보통%s 로 출력한다.
상수가 컴파일 된 후의 비트 형태
위의 정수,실수,문자,문자열 상수들은 코드를 입력하면 컴퓨터가 이해하는 아스키코드 값으로 저장된다.
*아스키 코드는 사람이 사용하는 기호를 컴퓨터 안에서 표현하는 방법
ex) A 입력 -> 01000001 로 저장
01000001 발견->A 띄워줌
컴파일러를 거쳐야 연산자가 명령어가 되고 상수는 연산 가능 형태로 바뀐다. 그전에는 그냥 하나의 문자일 뿐
*8비트 = 1바이트
정수상수 컴파일 = 4바이트로 표현
실수상수 컴파일 = 8바이트로 표현
문자상수 컴파일 = 2진수형태의 아스키코드로 번역 ex) A = 65 정수 65와 같은 형태로 번역됨
*정수는 가장 빠르고 정확하게 연산됨 so 왠만하면 정수 사용
*결국 문자 상수는 정수와 같은 방식으로 처리됨
*상수의 크기는 일정하지 않다. c++에선 문자상수도 1바이트 처리
정수 상수가 컴파일된 후의 비트 형태
정수는 양수 음수로 나뉨 음수데이터 표현방식이 독특하다.
양수변환 = 13은 2진수로 1101 정수는 4바이트 임으로 00000000 00000000 00000000 00001101 로 나머지 0으로 채움
*1비트가 왼쪽에 위치할수록 커짐.
정수의 표현범위 = 8비트 0~255 , 255 보다 큰 수 사용시 컴파일러가 데이터크기 4바이트로 늘려 처리
*13LL 처럼 뒤에 LL 붙이면 자동으로 데이터 크기 8바이트 처리됨
음수변환
음수는 절댓값을 2의 보수로 바꾸어 처리2의 보수 = 2진수 0과 1을 바꾼상태에서 1을 더한값
실수 상수가 컴파일된 후의 비트 형태
실수의 경우 제한된 데이터 크기의 수 표현 (아니면 너무 커진다, 비효율적)
실수 데이터크기의 여러 방식이 있지만 가장 많이 쓰는건 double
double = 8바이트를 사용하며 부호비트, 지수부, 소수부로 구성
부호비트 = 가장 왼쪽 비트, 0양수, 1음수
지수부 = 부호비트 다음 11비트
소수부 = 나머지 52비트
*실수상수의 오차 = 소수부분 나타내는 비트는 정확한 값 표현 불가. 결론적으로 실수데이터 표현방식에 정해져있는 유효숫자 까지의 숫자만 쓰는게 좋다. ex) double 형의 경유 15자리까지 유효숫자 사용 가능