Fundamental types
(참고: type - 타입 시스템 개요 및 C++ 라이브러리가 제공하는 타입 관련 유틸리티 목록 )
다음 유형들을 총칭하여 fundamental types 라고 합니다:
- (cv 한정자 적용 가능) void
|
(since C++11) |
목차 |
void
- void — 빈 값 집합을 가지는 타입. 완성될 수 없는 불완전 타입 입니다 (따라서 void 타입의 객체는 허용되지 않습니다). void 의 배열 이나 void 에 대한 참조 는 존재하지 않습니다. 그러나 void 포인터 와 void 타입을 반환하는 함수 (다른 언어에서의 프로시저 )는 허용됩니다.
|
std::nullptr_t
std::nullptr_t
는 널 포인터 리터럴
sizeof ( std:: nullptr_t ) 는 sizeof ( void * ) 와 같습니다. |
(C++11부터) |
정수형 타입
표준 정수형
- int — 기본 정수형. 아래에 나열된 수식어 중 하나라도 사용되는 경우 int 키워드는 생략될 수 있습니다. 길이 수식어가 없는 경우, 최소 16비트의 너비를 보장합니다. 그러나 32/64비트 시스템에서는 거의 항상 최소 32비트 너비를 보장합니다 (아래 참조).
수정자
기본 정수 형식을 수정합니다. 어떤 순서로든 혼합할 수 있습니다. 각 그룹에서 하나만 형식 이름에 포함될 수 있습니다.
- 부호 유무:
- signed — 대상 타입은 부호 있는(signed) 표현을 가질 것입니다 (생략 시 기본값)
- unsigned — 대상 타입은 부호 없는(unsigned) 표현을 가질 것입니다
- 크기:
- short — 대상 타입은 공간 최적화를 위해 설계되며 최소 16비트의 너비를 가집니다.
- long — 대상 타입은 최소 32비트의 너비를 가집니다.
|
|
(C++11부터) |
참고: 모든 타입 지정자와 마찬가지로 순서는 임의로 허용됩니다: unsigned long long int 와 long int unsigned long 는 동일한 타입을 지정합니다.
속성
다음 표는 다양한 일반적인 데이터 모델에서 사용 가능한 모든 표준 정수형과 그 속성을 요약한 것입니다:
| 형식 지정자 | 동등한 형식 | 비트 단위 너비 ( 데이터 모델 기준) | ||||
|---|---|---|---|---|---|---|
| C++ 표준 | LP32 | ILP32 | LLP64 | LP64 | ||
|
signed
char
|
signed char |
최소
8 |
8 | 8 | 8 | 8 |
|
unsigned
char
|
unsigned char | |||||
|
short
|
short int |
최소
16 |
16 | 16 | 16 | 16 |
|
short
int
|
||||||
|
signed
short
|
||||||
|
signed
short
int
|
||||||
|
unsigned
short
|
unsigned short int | |||||
|
unsigned
short
int
|
||||||
|
int
|
int |
최소
16 |
16 | 32 | 32 | 32 |
|
signed
|
||||||
|
signed
int
|
||||||
|
unsigned
|
unsigned int | |||||
|
unsigned
int
|
||||||
|
long
|
long int |
최소
32 |
32 | 32 | 32 | 64 |
|
long
int
|
||||||
|
signed
long
|
||||||
|
signed
long
int
|
||||||
|
unsigned
long
|
unsigned long int | |||||
|
unsigned
long
int
|
||||||
|
long
long
|
long
long
int
(C++11) |
최소
64 |
64 | 64 | 64 | 64 |
|
long
long
int
|
||||||
|
signed
long
long
|
||||||
|
signed
long
long
int
|
||||||
|
unsigned
long
long
|
unsigned
long
long
int
(C++11) |
|||||
|
unsigned
long
long
int
|
||||||
참고: 정수 연산은 부호 있는 정수와 부호 없는 정수 타입에 대해 다르게 정의됩니다. arithmetic operators , 특히 integer overflows 를 참조하십시오.
std::size_t
는
sizeof
연산자의 결과값인 부호 없는 정수형이며,
sizeof...
연산자와
alignof
연산자의 결과값이기도 합니다
(C++11부터)
.
확장 정수형확장 정수형은 구현에 따라 정의됩니다. 고정 너비 정수형 은 일반적으로 표준 정수형의 별칭입니다. |
(C++11부터) |
불리언 타입
문자 타입
문자 타입은 문자 표현을 위해 사용되는 정수 타입입니다.
- signed char — 부호 있는 문자 표현을 위한 타입.
- unsigned char — 부호 없는 문자 표현을 위한 타입. 또한 객체 표현 (원시 메모리)를 검사하는 데에도 사용됩니다.
-
char
— 대상 시스템에서 가장 효율적으로 처리될 수 있는 문자 표현을 위한 타입 (
signed
char
또는
unsigned
char
와 동일한 표현과 정렬을 가지지만 항상 별개의 타입입니다).
멀티바이트 문자 문자열
은 코드 단위를 표현하기 위해 이 타입을 사용합니다.
unsigned
char
타입의 모든 값이
[ 0 ,255]범위에 있을 때, 값을 char 로 변환한 후 다시 unsigned char 로 변환하면 원래 값이 생성됩니다. (C++11부터) char 의 부호 여부는 컴파일러와 대상 플랫폼에 따라 다릅니다: ARM과 PowerPC의 기본값은 일반적으로 unsigned이고, x86과 x64의 기본값은 일반적으로 signed입니다. - wchar_t — 와이드 문자 표현을 위한 타입 ( 와이드 문자열 참조). 정수 타입 중 하나와 동일한 크기, 부호 여부 및 정렬을 가지지만 별개의 타입입니다. 실제로 Linux 및 기타 많은 비-Windows 시스템에서는 32비트이며 UTF-32를 저장하지만, Windows에서는 16비트이며 UTF-16 코드 단위를 저장합니다. 표준은 원래 wchar_t 가 지원되는 모든 문자 코드 포인트를 표현할 수 있을 만큼 커야 한다고 요구했습니다. 그러나 이러한 요구 사항은 Windows에서 충족될 수 없으므로 결함 으로 간주되어 제거되었습니다.
|
|
(C++11부터) |
|
|
(C++20부터) |
최소 비트 수 외에도, C++ 표준은 다음을 보장합니다
-
1
==
sizeof
(
char
)
≤sizeof ( short )≤sizeof ( int )≤sizeof ( long )≤sizeof ( long long ) .
참고: 이는 극단적인 경우를 허용합니다. 즉,
바이트
가 64비트로 구성되고, 모든 타입(
char
포함)이 64비트 너비이며,
sizeof
가 모든 타입에 대해
1
을 반환하는 경우를 의미합니다.
부동소수점 타입
표준 부동소수점 타입
다음 세 가지 유형과 그들의 cv-한정 버전을 통칭하여 표준 부동 소수점 유형이라고 합니다.
- float — 단정밀도 부동소수점 타입. 일반적으로 IEEE-754 binary32 형식 을 사용합니다.
- double — 배정밀도 부동소수점 타입. 일반적으로 IEEE-754 binary64 형식 을 사용합니다.
-
long
double
— 확장 정밀도 부동소수점 타입. IEEE-754에서 규정한 타입에 반드시 매핑되지는 않습니다.
- IEEE-754 binary128 형식 은 일부 HP-UX, SPARC, MIPS, ARM64, z/OS 구현에서 사용됩니다.
- 가장 잘 알려진 IEEE-754 binary64-확장 형식 은 x87 80비트 확장 정밀도 형식 입니다. 많은 x86 및 x86-64 구현에서 사용됩니다 (주목할 만한 예외는 MSVC로, long double 을 double 과 동일한 형식, 즉 binary64로 구현합니다).
- PowerPC에서는 double-double 을 사용할 수 있습니다.
확장 부동 소수점 타입확장 부동 소수점 타입은 구현에 따라 정의됩니다. 여기에는 고정 폭 부동 소수점 타입 이 포함될 수 있습니다. |
(C++23부터) |
속성
부동 소수점 타입은 특수 값들 을 지원할 수 있습니다:
- 무한대 (양의 무한대와 음의 무한대), 참조 INFINITY
- 음의 영 , - 0.0 . 양의 영과 비교 시 동일하지만, 일부 산술 연산에서 의미를 가집니다. 예를 들어 1.0 / 0.0 == INFINITY 이지만 1.0 / - 0.0 == - INFINITY ), 그리고 일부 수학 함수에서 의미를 가집니다. 예를 들어 sqrt (std::complex)
- 숫자가 아님 (NaN), 어떤 값과도 비교 시 동일하지 않습니다 (자기 자신 포함). 여러 비트 패턴이 NaN을 나타냅니다, 참조 std::nan , NAN . C++는 시그널링 NaN에 대해 std::numeric_limits::has_signaling_NaN 을 통해 지원 감지 외에는 특별한 처리를 하지 않으며, 모든 NaN을 쿼이트 NaN으로 취급합니다.
부동 소수점 숫자는 산술 연산자 + , - , / , 그리고 * 와 함께 사용될 수 있으며, <cmath> 의 다양한 수학 함수와도 사용할 수 있습니다. 내장 연산자와 라이브러리 함수 모두 부동 소수점 예외를 발생시키고 math errhandling 에 설명된 대로 errno 을 설정할 수 있습니다.
부동 소수점 표현식은 해당 타입으로 표시된 범위와 정밀도보다 더 큰 범위와 정밀도를 가질 수 있습니다. 자세한 내용은 FLT_EVAL_METHOD 를 참조하십시오. 또한 부동 소수점 표현식은 축약(contracted) 될 수 있습니다. 즉, 모든 중간 값이 무한한 범위와 정밀도를 가지는 것처럼 계산될 수 있습니다. 자세한 내용은 #pragma STDC FP_CONTRACT 를 참조하십시오. 표준 C++은 부동 소수점 연산의 정확성을 제한하지 않습니다.
부동소수점 숫자에 대한 일부 연산은 부동소수점 환경 의 상태에 영향을 받으며 수정합니다 (가장 두드러지게는, 반올림 방향).
암시적 변환 은 부동 소수점 타입과 정수 타입 간에 정의됩니다.
부동소수점 타입의 추가 세부 정보, 한계 및 속성에 대해서는 부동소수점 타입의 한계 와 std::numeric_limits 를 참조하십시오.
값의 범위
다음 표는 일반적인 숫자 표현의 한계에 대한 참조를 제공합니다.
C++20 이전에는, C++ 표준은 모든 부호 있는 정수 표현을 허용했으며, N비트 부호 있는 정수의 최소 보장 범위는
-(2
N-1
-1)
부터
+2
N-1
-1
까지였습니다(예를 들어 8비트 부호 있는 타입의 경우
−127
부터
127
까지). 이는
1의 보수(ones' complement)
또는
부호-크기(sign-and-magnitude)
방식의 한계에 해당합니다.
그러나 모든 C++ 컴파일러는
two's complement
표현을 사용하며, C++20 기준으로 표준에서 허용하는 유일한 표현 방식입니다. 보장된 범위는
-2
N-1
부터
+2
N-1
-1
까지입니다(예:
−128
부터
127
까지, 부호 있는 8비트 타입의 경우).
C++11부터( CWG issue 1759 의 해결을 통해) 8비트 1의 보수 및 부호화-크기 표현은 char 에 대해 허용되지 않습니다. 왜냐하면 UTF-8 문자열 리터럴 에서 사용되는 값 0x80의 UTF-8 코드 유닛이 char 타입 객체에 저장 가능해야 하기 때문입니다.
부동 소수점 타입
T
의 범위는 다음과 같이 정의됩니다:
-
최소 보장 범위는
T에서 표현 가능한 가장 음의 유한 부동 소수점 수부터T에서 표현 가능한 가장 양의 유한 부동 소수점 수까지입니다. -
만약 음의 무한대가
T에서 표현 가능하다면,T의 범위는 모든 음의 실수로 확장됩니다. -
만약 양의 무한대가
T에서 표현 가능하다면,T의 범위는 모든 양의 실수로 확장됩니다.
음의 무한대와 양의 무한대가 ISO/IEC/IEEE 60559 형식으로 표현 가능하므로, 모든 실수는 ISO/IEC/IEEE 60559를 준수하는 부동 소수점 타입의 표현 가능한 값 범위 내에 있습니다.
| 유형 | 비트 크기 | 형식 | 값 범위 | |
|---|---|---|---|---|
| 근사값 | 정확한 값 | |||
| 문자 | 8 | 부호 있음 | −128 ~ 127 | |
| 부호 없음 | 0 ~ 255 | |||
| 16 | UTF-16 | 0 ~ 65535 | ||
| 32 | UTF-32 | 0 ~ 1114111 ( 0x10ffff ) | ||
| 정수 | 16 | 부호 있음 | ± 3.27 · 10 4 | −32768 ~ 32767 |
| 부호 없음 | 0 ~ 6.55 · 10 4 | 0 ~ 65535 | ||
| 32 | 부호 있음 | ± 2.14 · 10 9 | −2,147,483,648 ~ 2,147,483,647 | |
| 부호 없음 | 0 ~ 4.29 · 10 9 | 0 ~ 4,294,967,295 | ||
| 64 | 부호 있음 | ± 9.22 · 10 18 | −9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
| 부호 없음 | 0 ~ 1.84 · 10 19 | 0 ~ 18,446,744,073,709,551,615 | ||
|
이진
부동소수점 |
32 | IEEE-754 |
|
|
| 64 | IEEE-754 |
|
|
|
| 80 [참고 1] | x86 |
|
|
|
| 128 | IEEE-754 |
|
|
|
- ↑ 객체 표현은 일반적으로 32/64비트 플랫폼에서 각각 96/128비트를 차지합니다.
참고: 이러한 타입으로 표현 가능한 값들의 실제 (보장된 최소값이 아닌) 한계는 C 숫자 한계 인터페이스 와 std::numeric_limits 에서 확인할 수 있습니다.
데이터 모델
각 구현체가 기본 타입들의 크기에 대해 내린 선택들은 총체적으로 데이터 모델(data model) 로 알려져 있습니다. 널리 채택된 네 가지 데이터 모델이 있습니다:
32비트 시스템:
-
- LP32 또는 2/4/4 ( int 는 16비트, long 과 포인터는 32비트)
-
- Win16 API
- ILP32 또는 4/4/4 ( int , long , 그리고 포인터는 32비트);
-
- Win32 API
- 유닉스 및 유닉스 계열 시스템 (Linux, macOS)
64비트 시스템:
-
- LLP64 또는 4/4/8 ( int 와 long 은 32비트, 포인터는 64비트)
- LP64 또는 4/8/8 ( int 은 32비트, long 과 포인터는 64비트)
-
- 유닉스 및 유닉스 계열 시스템 (Linux, macOS)
다른 모델들은 매우 드뭅니다. 예를 들어, ILP64 ( 8/8/8 : int , long , 그리고 포인터가 64비트인) 모델은 일부 초기 64비트 유닉스 시스템에서만 등장했습니다 (예: Cray의 UNICOS ).
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_unicode_characters
|
200704L
|
(C++11) | 새로운 문자 타입 ( char16_t 및 char32_t ) |
__cpp_char8_t
|
201811L
|
(C++20) | char8_t |
202207L
|
(C++23) |
char8_t
호환성 및 이식성 수정 (
(unsigned) char
배열 초기화 허용
from
UTF-8 문자열 리터럴
)
|
키워드
void , bool , true , false , char , char8_t , char16_t , char32_t , wchar_t , int , short , long , signed , unsigned , float , double
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| CWG 238 | C++98 | 부동 소수점 구현에 부과된 제약 조건이 명시되지 않음 |
다음과 같이 명시됨
제약 없음 |
| CWG 1759 | C++11 | char 가 UTF-8 코드 유닛 0x80을 표현할 수 있다는 보장이 없음 | 보장됨 |
| CWG 2689 | C++11 | cv 한정자 std::nullptr_t 가 기본 타입이 아니었음 | 기본 타입임 |
| CWG 2723 | C++98 | 부동 소수점 타입들의 표현 가능 값 범위가 명시되지 않음 | 명시됨 |
| P2460R2 | C++98 |
wchar_t
가 지원되는 로캘 중 가장 큰 확장 문자 집합의 모든 멤버에 대해
구별되는 코드를 표현할 수 있어야 했음 |
요구되지 않음 |
참조문헌
- C++23 표준 (ISO/IEC 14882:2024):
-
- 6.8.2 기본 타입 [basic.fundamental]
- C++20 표준(ISO/IEC 14882:2020):
-
- 6.8.1 기본 타입 [basic.fundamental]
- C++17 표준 (ISO/IEC 14882:2017):
-
- 6.9.1 기본 타입 [basic.fundamental]
- C++14 표준(ISO/IEC 14882:2014):
-
- 3.9.1 기본 타입 [basic.fundamental]
- C++11 표준(ISO/IEC 14882:2011):
-
- 3.9.1 기본 타입 [basic.fundamental]
- C++03 표준 (ISO/IEC 14882:2003):
-
- 3.9.1 기본 타입 [basic.fundamental]
- C++98 표준(ISO/IEC 14882:1998):
-
- 3.9.1 기본 타입 [basic.fundamental]
참고 항목
|
C documentation
에 대한
arithmetic types
|