Namespaces
Variants

Fundamental types

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

(참고: type - 타입 시스템 개요 및 C++ 라이브러리가 제공하는 타입 관련 유틸리티 목록 )

다음 유형들을 총칭하여 fundamental types 라고 합니다:

  • (cv 한정자 적용 가능) void
(since C++11)

목차

void

void — 빈 값 집합을 가지는 타입. 완성될 수 없는 불완전 타입 입니다 (따라서 void 타입의 객체는 허용되지 않습니다). void 배열 이나 void 에 대한 참조 는 존재하지 않습니다. 그러나 void 포인터 void 타입을 반환하는 함수 (다른 언어에서의 프로시저 )는 허용됩니다.

std::nullptr_t

헤더 파일에 정의됨 <cstddef>
typedef decltype ( nullptr ) nullptr_t ;
(C++11부터)

std::nullptr_t 는 널 포인터 리터럴 nullptr 의 타입입니다. 이것은 포인터 타입이나 멤버 포인터 타입이 아닌 별개의 타입입니다. 모든 해당 prvalue는 널 포인터 상수 입니다.

sizeof ( std:: nullptr_t ) sizeof ( void * ) 와 같습니다.

(C++11부터)

정수형 타입

표준 정수형

int — 기본 정수형. 아래에 나열된 수식어 중 하나라도 사용되는 경우 int 키워드는 생략될 수 있습니다. 길이 수식어가 없는 경우, 최소 16비트의 너비를 보장합니다. 그러나 32/64비트 시스템에서는 거의 항상 최소 32비트 너비를 보장합니다 (아래 참조).
수정자

기본 정수 형식을 수정합니다. 어떤 순서로든 혼합할 수 있습니다. 각 그룹에서 하나만 형식 이름에 포함될 수 있습니다.

  • 부호 유무:
signed — 대상 타입은 부호 있는(signed) 표현을 가질 것입니다 (생략 시 기본값)
unsigned — 대상 타입은 부호 없는(unsigned) 표현을 가질 것입니다
  • 크기:
short — 대상 타입은 공간 최적화를 위해 설계되며 최소 16비트의 너비를 가집니다.
long — 대상 타입은 최소 32비트의 너비를 가집니다.

long long — 대상 타입은 최소 64비트의 너비를 가질 것입니다.
(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부터)

불리언 타입

bool — 두 값 중 하나를 보유할 수 있는 정수형: true 또는 false . sizeof ( bool ) 의 값은 구현에 따라 정의되며 1 과 다를 수 있습니다.

문자 타입

문자 타입은 문자 표현을 위해 사용되는 정수 타입입니다.

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에서 충족될 수 없으므로 결함 으로 간주되어 제거되었습니다.

char16_t — UTF-16 문자 표현을 위한 타입으로, 모든 UTF-16 코드 유닛(16비트)을 표현할 수 있을 만큼 충분히 크도록 요구됩니다. std::uint_least16_t 와 크기, 부호 특성, 정렬 방식이 동일하지만 별개의 타입입니다.

char32_t — UTF-32 문자 표현을 위한 타입으로, 모든 UTF-32 코드 유닛(32비트)을 표현할 수 있을 만큼 충분히 크도록 요구됩니다. std::uint_least32_t 와 크기, 부호 특성, 정렬 방식이 동일하지만 별개의 타입입니다.
(C++11부터)

char8_t — UTF-8 문자 표현을 위한 타입으로, 모든 UTF-8 코드 유닛(8비트)을 표현할 수 있을 만큼 충분히 커야 합니다. unsigned char 와 동일한 크기, 부호 속성 및 정렬 요구사항을 가지며(따라서 char signed char 와도 동일한 크기와 정렬을 가짐), 별개의 타입입니다.
(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에서 규정한 타입에 반드시 매핑되지는 않습니다.

확장 부동 소수점 타입

확장 부동 소수점 타입은 구현에 따라 정의됩니다. 여기에는 고정 폭 부동 소수점 타입 이 포함될 수 있습니다.

(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
  • 최소 서브노멀:
    ± 1.401,298,4 · 10 −45
  • 최소 노멀:
    ± 1.175,494,3 · 10 −38
  • 최대:
    ± 3.402,823,4 · 10 38
  • 최소 서브노멀:
    ±0x1p−149
  • 최소 노멀:
    ±0x1p−126
  • 최대:
    ±0x1.fffffep+127
64 IEEE-754
  • 최소 서브노멀:
    ± 4.940,656,458,412 · 10 −324
  • 최소 노멀:
    ± 2.225,073,858,507,201,4 · 10 −308
  • 최대:
    ± 1.797,693,134,862,315,7 · 10 308
  • 최소 서브노멀:
    ±0x1p−1074
  • 최소 노멀:
    ±0x1p−1022
  • 최대:
    ±0x1.fffffffffffffp+1023
80 [참고 1] x86
  • 최소 서브노멀:
    ± 3.645,199,531,882,474,602,528
    · 10 −4951
  • 최소 노멀:
    ± 3.362,103,143,112,093,506,263
    · 10 −4932
  • 최대:
    ± 1.189,731,495,357,231,765,021
    · 10 4932
  • 최소 서브노멀:
    ±0x1p−16445
  • 최소 노멀:
    ±0x1p−16382
  • 최대:
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • 최소 서브노멀:
    ± 6.475,175,119,438,025,110,924,
    438,958,227,646,552,5 · 10 −4966
  • 최소 노멀:
    ± 3.362,103,143,112,093,506,262,
    677,817,321,752,602,6 · 10 −4932
  • 최대:
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 10 4932
  • 최소 서브노멀:
    ±0x1p−16494
  • 최소 노멀:
    ±0x1p−16382
  • 최대:
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
  1. 객체 표현은 일반적으로 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