* 기본자료형과 표현범위 (ANSI:표준) : int,long은 시스템에 따라 크기가 다를 수 있음
- 메모리 공간을 적절히 사용하기 위해 다양한 자료형을 제공한다.
- 작은 메모리 공간에 큰데이터를 저장할 경우 손실발생
(1byte에 100만을 대입..100을 대입하려면 4byte이상 되어야 한다.)
자료형(정수형) 할당 메모리 크기 표현 데이터 범위
char 1byte -128 ~ 127 (2^8 : 256가지)
short 2byte -32768 ~ 32767 ( 2^16 )
int (과거 2byte였음) 4byte -2147483648 ~ 2147483647 ( 2^32 )
long(4byte~이상) 4byte -2147483648 ~ 2147483647 (4byte인 경우)
자료형(실수형) 할당 메모리 크기 표현 데이터 범위
float 4byte 3.4 * 10^-37 ~ 3.4 * 10^38
double 8byte 1.7 * 10^-307 ~ 1.7 * 10^308
long double 8byte이상 시스템에 따라 차이가 많이 나타남
* sizeof() 연산자
- 피연산자의 메모리 크기를 반환
- 피연산자로 자료형의 이름이 올 경우 괄호를 반드시 사용
- 그 이외의 경우 괄호의 사용은 선택적
* 자료형 선택의 기준
- 정수형 데이터의 경우
: 컴퓨터는 내부적으로 int의 연산을 가장 빠르게 처리
: 범위가 int형 변수를 넘어가는 경우 long으로 선언
- 실수형 데이터의 경우
: 선택의 지표는 정밀도
: 최근은 일반적으로 double을 사용(값의 크기가 크므로 보다 정확함)
자료형 정밀도
float(4b) 소수점 이하 6자리
double(8b) 소수점 이하 15자리(AVM1에서 사용되는 소수점 수식 데이터형)
long double double의 정밀도와 같거나 크다.
- unsigned가 붙어서 달라지는 표현 범위
: MSB까지도 데이터의 크기를 표현
: 양의 정수로 인식
: 실수형 자료형에는 붙일 수 없다
자료형(정수형) 할당 메모리 크기 표현 데이터 범위
char 1byte -128 ~ 127
unsigned char 1byte 0 ~ ( 127 + 128 )
short 2byte -32768 ~ 32767
unsigned short 2byte 0 ~ ( 32767 + 32768 )
int 4byte -2147483648 ~ 2147483647
unsigned int 4byte 0 ~ ( 2147483647 + 2147483648 )
long 4byte -2147483648 ~ 2147483647
unsigned long 4byte 0 ~ ( 2147483647 + 2147483648 )
* 문자표현을 위한 ASCII코드 등장 :
컴퓨터는 2진수만 처리 가능하므로 문자와 2진수사이에 mapping을 처리한다.
예) A:65 , B:66 (A 65 부터 Z까지 1씩 증가, 소문자는 a:97부터 1씩 증가)
- 미국 표준 협회 ANSI에 의해 정의
- 컴퓨터를 통해서 문자를 표현하기 위한 표준
- 문자와 숫자의 연결 관계를 정의
* ASCII코드의 범위
- 0이상 127이하
- char형으로 처리하는 것이 합리적 : 정수는 int가 합리적 이유는 연산을 위함, char는 연산을 하지
않으므로 1byte로 처리
* 문자의 표현
- 따옴표( '' )를 이용, C에서는 쌍따옴표("")를 사용하지 않는다.
예) char ch1 = 'a' -> 내부적으로 65의 값을 갖는 2진수로 저장된다.
* 리터럴(Literal) 상수
- 이름을 지니지 않는 상수
예) int a = 30(상수) + 40(상수) => a에는 우항의 두 값을 메모리에 등록되어 CPU가 연산한 후 70이 대입
참고) 30과 40이라는 값은 이름이 없으므로 재사용 할 수 없다.
- 상수도 메모리 공간에 저장되기 위해서 자료형이 결정된다.
예) char c='A' : 문자상수
int i=5 : 정수상수
double d=3.15 : 실수상수
참고) 좌항과 우항의 사용메모리는 서로 다르며 별도로 데이터 타입이 결정된다.
증명) float f = 1.7 * 10^308 // 실제 메모리에 등록된 우항(double)의 크기가 좌항에서 선언한 float보다 크므로 값은 잘려서 들어가게 된다.
* 심볼릭 상수
- 이름이 있는 상수
- const를 이용하여 상수화
- 매크로를 이용한 상수화
예1) const int MAX = 300;
const double PI=3.1415;
참고) 상수는 변수와 구분하기 위하여 대문자로 표기하는 것이 관례
예2) const int MAX //상수선언(가비지 값으로 채워짐)
MAX = 300; //상수에 값 대입 불가.
* 자료형 변환의 형태
- 자동형 변환(묵시적 형 변환) : 자동적으로 발생하는 형태의 변환
- 강제형 변환(명시적 형 변환) : 개발자가 명시적으로 형 변환을 요청
* 자동형 변환이 발생하는 상황1
- 대입연산 시
예) 1.3 + 1 => 연산불가..따라서 자동으로 자료형으로 변환 후 연산가능
int n = 5.25 //소수부의 손실( 5 ) - warning발생
double d = 3 //값의 표현범위( 3 -> 3.0.. )가 넒으므로 이상없음
char c = 129 //상위비트 손실( -127 ) : 4byte에서 1byte에 저장하므로 앞의 3byte는 손실 - warning발생
* 자동형 변환이 발생하는 상황2
- 정수의 자동 승격에 의해(int현 연산이 빠른 이유) : 정수형 연사 자체를 int로 단일화 시켰기 때문이다.
예) char c1 = 10, c2 = 20;
char c3 = c1+c2 //c1과 c2는 int로 형변환 연산한 30을 다시 char로 변환하여 c3에 대입
* 자동형 변환이 발생하는 상황3
- 산술연산 과정에 의해여
예) 5.5(double) + 7(int) : int를 double로 변환(데이터의 손실을 자동으로 최소화 시킨다.)
3.14f(float) + 5.25(double) : float를 double로 변환(데이터의 손실을 자동으로 최소화 시킨다.)
참고) [정수] char(1) -> int(4) -> long(4) -> [실수] float(4) -> double(8) -> long double(8이상)
순으로 변환하는 것이 손실을 최소화 시킨다.(바이트의 크기가 큰쪽으로 변환이 일어난다)
* 강제형 변환
- 프로그래머의 요청에 의해 변환
예) float f = (float)3.14 : f의 값은 3.14
double e1 = 3 + 3.14 : e1의 값은 6.14
double e2 = 3 + (int)3.14 : e2의 값은 6
참고) 아스키 코드표