파게로그
자료형 본문
char
short
int
long
float
double
long double
char
char ch1 = 'a' // 97 'a'
char ch2 = ch1 + 1; // 98 'b'
char ch3 = 99; // 99 'c'
• 표준
최소 8비트인 정수형
• char에 대해 새롭게 알게 된 사실
· C 표준에서 1byte란 8bit가 아니라 CHAR_BIT로 정의된다.
· char는 기기에서 접근할 수 있는 가장 작은 단위이다.
• 포팅 문제 없는 값의 범위
· unsigned char: 0 ~ 255
· char: 0 ~ 127
· signed char: -127 ~ 127
• 표준과 무관하게 일반적으로 사용되는 값의 범위
· unsigned char: 0 ~ 255
· char: signed
· signed char: -128 ~ 127
• C 표준에서 1byte란 8bit가 아니라 CHAR_BIT이다.
• char는 기기에서 접근할 수 있는 가장 작은 단위
• 일반적으로 char는 8bit로 사용된다.
• 포팅 문제 없는 값의 범위에서 -128이 포함되지 않는 것은, 아주 일부의, 1의 보수를 쓰는 시스템이 있을 수도 있기 때문이다.
• char는 정수형으로서 ASCII 문자를 표현하기에 충분. 아스키는 0~127의 숫자(7비트)
(가장 앞 부호비트를 쓰고있지 않는 느낌...)
• signed/unsigned를 명시하지 않으면... → 정의되어 있지 않음. 컴파일러 구현을 따라 정해짐.
(Clang Windows에선 signed)
• 8비트 정수형으로 쓸때는 char 앞에 signed/unsigned를 명시하는 편이 좋다.
(명시하지 않으면 0~127(00000000~01111111)만 안전하게 사용 가능)
• char가 몇 비트인지 알아보기: <limits.h> include 후 CHAR_BIT 확인 // 보통 8 '\b'
• char의 부호 여부 판단하기: <limits.h>에서 CHAR_MIN을 확인... 0이면 unsigned, SCHAR_MIN이면 signed
short
• 표준
최소 16비트, char의 크기 이상인 정수형
• 포팅 문제 없는 값의 범위
unsigned short: 0 ~ 65,535
signed short: -32,767 ~ 32,767
• 표준과 무관하게 일반적으로 사용되는 값의 범위
unsigned short: 0 ~ 65,535
signed short: -32,768 ~ 32,767
• 보통은 int보다 짧음 (메모리를 절약할 수 있지만 성능을 희생해야 할 수도 있음)
int
- 표준
최소 16비트, short의 크기 이상인 정수형
- CPU에게 앞뒤 생략하고 '정수 처리해!' 라고 하면 CPU가 딱 아는 크기여야 함
-> CPU의 산술논리장치(ALU, Arithmetic Logic Unit)가 사용하는 기본 데이터
-> 이 데이터를 워드(word)라 하고, 그 크기를 워드 크기라고 함
-> 워드 크기는 레지스터 크기와 일치
-> 즉 CPU마다 다르고.. 예전에는 16비트 CPU가 흔했어서 최소 16비트 기준인 것
- 지금은 64비트 컴퓨터... 하지만 int는 여전히 32bit
-> 원칙적으로는 C 표준 어긴 것
-> 64비트로 올리면 32비트 정수를 어떻게 표현하지?
-> 너무 오랫동안 32비트를 int의 크기로 사용
-> 32비트에서 64비트로 바꾼다고 성능이 무조건 빨라지지는 않음(ex 캐시메모리 등)
- 포팅 문제 없는 값의 범위
short와 같음
- 표준과 무관하게 일반적으로는...
unsigned int: 0 ~ 4,294,967,295
signed int: -2,147,483,648 ~ 2,147,483,647
- int의 리터럴
'u' or 'U': unsigned 수를 표현하는 접미사 (일반적으로 소문자를 더 많이 씀)
: 부호 있는 수의 최댓값보다 큰 값을 unsigned int에 대입할 경우 붙여야 함
: 안 붙이면 warning 발생
-> unsigned int u1 = 300; // ok
-> unsigned int u2 = 2147483648; // warning occurs
-> unsigned int u3 = 2147483648u; // no warning occurs
long
int가 16비트일 때 그것보다 2배 큰 자료형이 필요했음
long은 최소 32비트이고 int 이상의 크기인 정수형... 사실상 int...
(다른 언어에서는 보통 long은 64비트)
최소 64비트인 정수형 -> C89에는 없음
포팅 안전한 범위 : -2147483647~2147483647
- 일반적으로는... int와 같음;;
long의 리터럴
'l' or 'L': long을 의미하는 접미사
'u' or 'U': 부호 없는(unsigned) 수를 표현하는 접미사
두 접미사를 같이 쓸 수 있음: UL/LU/lu/ul 주로 UL, ul 많이 씀
float
부동소수점 자료형은 IEEE 754로 대동단결...! (float: IEEE 754 single: 32bit/ double: IEEE 754 double: 64bit)
but C는 CPU가 IEEE 754를 지원하는 실수 계산 장치를 장착하기 이전부터 쓰였기에...
float num = 3.14f; // ok
unsigned float num1 = 3.14f; // 컴파일 에러
signed float num2 = -3.14f; // 컴파일 에러
- C표준에 따르면...
->float는 IEEE 754를 따를 수도, 그러지 않을 수도 있음 - 컴파일러 구현에 따라 다름
(크기는 char 이상이기만 하면 됨)
-> unsigned형 없음
- 일반적으로는...
크기:32비트 / 범위:IEEE 754 single과 동일
- 관련 헤더파일: float.h
- 리터럴
float pi1 = 3.14f; // ok
float pi2 = 3.14uf; // 컴파일 에러. 접미사 u를 사용하지않는다
-> 'f' or 'F': float를 의미하는 접미사 (보통 'f') 3.0f, 3.f 중엥서는 3.f를 더 많이쓴다
double
표준에 따르면... CPU가 계산에 사용하는 기본 데이터 크기, float 이상 크기...
float는 double보다 빠른 연산을 위해 만든 작은 부동소수점
-> 컴파일러 구현마다 다름 (IEEE 754 Double이라는 보장이 없음)
unsigned형 없음
double num = 3.14; //ok
unsigned double ud = 3.14; // 컴파일에러(unsigned x)
signed double sd = -3.14; // 컴파일에러(signed x)
- 표준과 관계없이 일반적으로는..
크기: 64비트 / 범위: IEEE 754 Double과 동일 / 관련헤더파일: float.h
long double
- double보다 높은 정밀도 (일반적으로는 double과 long double이 같음)
- double 이상의 크기면 됨
- unsigned형 없음
- 관련헤더파일: float.h
unsigned, signed
char 제외하고는 생략 시 signed가 기본
- 데스크톱에서
long(32bit)을 제외하고는 대개 다른 언어와 비슷하게 사용 가능
- 소형기기에서
매뉴얼에서 자료형 크기 확인 후 사용
- 범용적인 코드라면
포팅이 보장되는 범위의 값으로만 사용할 것
float, double은 플랫폼 사이에 값이 정확히 일치하지 않을 수 있음 (비트패턴에 의존하지 말 것)
bool
없으며, 0, 1로 표현함