Namespaces
Variants

Arithmetic types

From cppreference.net

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

목차

불리언 타입

  • _Bool (매크로 bool 로도 접근 가능) (C23 이전) bool (C23 이후) — 두 값 중 하나를 보유할 수 있는 타입: 1 0 (매크로 true false 로도 접근 가능) (C23 이전) true false (C23 이후) .

변환 _Bool (C23 이전) bool (C23 이후) 으로 수행될 때는 다른 정수 타입으로의 변환과 다르게 동작함에 유의하십시오: ( bool ) 0.5 true 로 평가되는 반면, ( int ) 0.5 0 으로 평가됩니다.

(C99 이후)

문자 타입

  • signed char — 부호 있는 문자 표현을 위한 타입.
  • unsigned char — 부호 없는 문자 표현을 위한 타입. 또한 객체 표현 (원시 메모리)를 검사하는 데에도 사용됩니다.
  • char — 문자 표현을 위한 타입. signed char 또는 unsigned char 중 하나와 동등하지만(어느 것인지는 구현에 따라 정의되며 컴파일러 명령줄 스위치로 제어될 수 있음), char signed char unsigned char 모두와 구별되는 별개의 타입입니다.

표준 라이브러리는 또한 typedef 이름으로 wchar_t , char16_t char32_t (C11부터) 를 정의하여 와이드 문자를 표현하며 UTF-8 문자를 위한 char8_t 도 포함합니다 (C23부터) .

정수형

  • short int ( short 으로도 접근 가능, signed 키워드 사용 가능)
  • unsigned short int ( unsigned short 으로도 접근 가능)
  • int ( signed int 으로도 접근 가능)
해당 플랫폼에서 가장 최적의 정수 타입이며, 최소 16비트임이 보장됩니다. 대부분의 현대 시스템은 32비트를 사용합니다(아래 데이터 모델 참조).
  • unsigned int ( unsigned 으로도 접근 가능), int 의 부호 없는 버전으로 모듈로 연산을 구현합니다. 비트 조작에 적합합니다.
  • long int ( long 으로도 접근 가능)
  • unsigned long int ( unsigned long 으로도 접근 가능)
  • long long int ( long long 로도 접근 가능)
  • unsigned long long int ( unsigned long long 로도 접근 가능)
(C99부터)
  • _BitInt ( n ) ( signed _BitInt ( n ) 로도 접근 가능), 비트 정밀 부호 있는 정수 타입 (여기서 n 은 정밀한 너비(부호 비트 포함)를 나타내는 정수 상수 표현식으로 대체되며, <limits.h> BITINT_MAXWIDTH 보다 클 수 없음)
  • unsigned _BitInt ( n ) , 비트 정밀 부호 없는 정수 타입 (여기서 n 은 정밀한 너비를 나타내는 정수 상수 표현식으로 대체되며, <limits.h> BITINT_MAXWIDTH 보다 클 수 없음)
(C23부터)

참고: 모든 타입 지정자와 마찬가지로 순서는 상관없습니다: unsigned long long int long int unsigned long 는 동일한 타입을 지정합니다.

다음 표는 사용 가능한 모든 정수형과 그 속성을 요약한 것입니다:

**설명:** - HTML 태그와 속성은 그대로 유지되었습니다 - ` ` 태그 내의 C++ 키워드는 번역하지 않았습니다 - `unsigned char`는 C++ 자료형으로 전문 용어이므로 번역하지 않았습니다 - 원본 포맷팅이 완전히 보존되었습니다 **번역 결과:** **설명:** - ` ` 태그 내부의 텍스트는 C++ 코드로 간주되어 번역하지 않음 - `unsigned int`는 C++ 예약어이므로 원문 유지 - HTML 태그와 속성은 모두 그대로 보존 (설명: HTML 태그 내부의 C++ 키워드(signed long long)는 번역하지 않고 그대로 유지합니다. 이는 C++ 전문 용어로, 번역 대상에서 제외해야 합니다.) (설명: HTML 태그 내의 C++ 키워드와 코드는 번역하지 않고 그대로 유지되었습니다. 이 코드 조각은 번역할 일반 텍스트가 포함되어 있지 않습니다.)
형식 지정자 동등한 형식 데이터 모델별 비트 너비
C 표준 LP32 ILP32 LLP64 LP64
char
char 최소
8
8 8 8 8
signed char
signed char
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
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
(C99)
최소
64
64 64 64 64
long long int
signed long long
signed long long int
unsigned long long
unsigned long long int
(C99)
unsigned long long int

최소 비트 수 외에도, C 표준은 다음을 보장합니다

1 == sizeof ( char ) sizeof ( short ) sizeof ( int ) sizeof ( long ) sizeof ( long long ) .

참고: 이는 극단적인 경우를 허용합니다. 즉, byte 가 64비트로 구성되고, 모든 타입( char 포함)이 64비트 너비이며, sizeof 가 모든 타입에 대해 1 을 반환하는 경우를 의미합니다.

참고: 정수 연산은 부호 있는 정수 타입과 부호 없는 정수 타입에 대해 다르게 정의됩니다. 산술 연산자 , 특히 정수 오버플로우 를 참조하십시오.

데이터 모델

각 구현체가 기본 타입들의 크기에 대해 내린 선택을 총체적으로 데이터 모델(data model) 이라고 합니다. 널리 채택된 네 가지 데이터 모델이 있습니다:

32비트 시스템:

  • LP32 또는 2/4/4 ( int 는 16비트, long 과 포인터는 32비트)
  • Win16 API
  • ILP32 또는 4/4/4 ( int , long , 그리고 포인터는 32비트);
  • Win32 API
  • 유닉스 및 유닉스 계열 시스템 (Linux, Mac OS X)

64비트 시스템:

  • LLP64 또는 4/4/8 ( int long 은 32비트, 포인터는 64비트)
  • Win64 API
  • LP64 또는 4/8/8 ( int 은 32비트, long 과 포인터는 64비트)
  • 유닉스 및 유닉스 계열 시스템 (Linux, Mac OS X)

다른 모델들은 매우 드뭅니다. 예를 들어, ILP64 ( 8/8/8 : int , long , 그리고 포인터가 64비트인) 모델은 일부 초기 64비트 유닉스 시스템에서만 등장했습니다 (예: Cray의 Unicos ).

정확한 너비 정수형은 C99부터 <stdint.h> 에서 사용 가능합니다.

실수 부동소수점 타입

C 언어는 실수 부동 소수점 값을 표현하기 위해 세 가지 또는 여섯 가지 (C23 이후) 타입을 가지고 있습니다:

  • float — 단정밀도 부동소수점 타입. 지원되는 경우 IEEE-754 binary32 형식 과 일치합니다.
  • double — 배정밀도 부동소수점 타입. 지원되는 경우 IEEE-754 binary64 형식 과 일치합니다.
  • long double — 확장 정밀도 부동소수점 타입. 지원되는 경우 IEEE-754 binary128 형식 과 일치하며, 그렇지 않은 경우 지원되는 경우 IEEE-754 binary64 -확장 형식 과 일치하며, 그렇지 않은 경우 정밀도가 binary64 보다 우수하고 범위가 최소한 binary64 와 동등한 비-IEEE-754 확장 부동소수점 형식과 일치하며, 그렇지 않은 경우 IEEE-754 binary64 형식과 일치합니다.
    • binary128 형식은 일부 HP-UX, SPARC, MIPS, ARM64 및 z/OS 구현에서 사용됩니다.
    • 가장 잘 알려진 IEEE-754 binary64 -확장 형식은 80비트 x87 확장 정밀도 형식입니다. 많은 x86 및 x86-64 구현에서 사용됩니다 (주목할 만한 예외는 MSVC로, long double double 과 동일한 형식, 즉 binary64 로 구현합니다).
구현체가 매크로 상수 __STDC_IEC_60559_DFP__ 를 미리 정의하는 경우, 다음의 십진 부동 소수점 타입들도 지원됩니다.
그렇지 않은 경우, 이러한 십진 부동 소수점 타입들은 지원되지 않습니다.
(C23부터)

부동 소수점 타입은 특수한 값들을 지원할 수 있습니다:

  • 무한대 (양의 무한대 및 음의 무한대), 참조: INFINITY
  • 음의 영 , - 0.0 . 양의 영과 비교 시 동일하게 취급되지만, 일부 산술 연산에서 의미를 가집니다. 예를 들어 1.0 / 0.0 == INFINITY 이지만 1.0 / - 0.0 == - INFINITY )
  • 비-숫자 (NaN), 어떤 값과도 비교 시 동등하지 않음 (자기 자신 포함). 여러 비트 패턴이 NaN을 나타냅니다, 참조: nan , NAN . C 언어는 시그널링 NaN(IEEE-754에서 규정)에 특별한 처리를 하지 않으며, 모든 NaN을 정적 NaN으로 취급합니다.

실수 부동 소수점 숫자는 산술 연산자 + - / * <math.h> 의 다양한 수학 함수와 함께 사용될 수 있습니다. 내장 연산자와 라이브러리 함수 모두 부동 소수점 예외를 발생시키고 errno 를 설정할 수 있으며, 이는 math_errhandling 에 설명된 대로 동작합니다.

부동 소수점 표현식은 해당 타입으로 표시된 범위와 정밀도보다 더 넓은 범위와 높은 정밀도를 가질 수 있습니다. 자세한 내용은 FLT_EVAL_METHOD 를 참조하십시오. 대입(Assignment) , 반환(return) , 그리고 형변환(cast) 은 범위와 정밀도를 선언된 타입에 연관된 값으로 강제합니다.

부동 소수점 표현식은 또한 축약(contracted) 될 수 있습니다. 즉, 모든 중간 값이 무한한 범위와 정밀도를 가진 것처럼 계산될 수 있습니다. 자세한 내용은 #pragma STDC FP_CONTRACT 를 참조하십시오.

부동 소수점 숫자에 대한 일부 연산은 부동 소수점 환경 의 상태에 영향을 받고 수정합니다 (가장 주목할 만한 것은 반올림 방향입니다).

암시적 변환 은 실수 부동소수점 타입과 정수, 복소수, 허수 타입 사이에 정의됩니다.

자세한 내용, 한계 및 부동 소수점 타입의 속성에 대해서는 부동 소수점 타입의 한계 <math.h> 라이브러리를 참조하십시오.

복소 부동 소수점 타입

복소 부동 소수점 타입은 수학적 복소수 를 모델링하며, 이는 실수와 실수가 허수 단위와 곱해진 값의 합으로 작성될 수 있는 숫자입니다: a + bi

세 가지 복합 타입은

참고: 모든 타입 지정자와 마찬가지로 순서는 임의로 지정할 수 있습니다: long double complex , complex long double , 그리고 심지어 double complex long 도 모두 동일한 타입을 나타냅니다.

#include <complex.h>
#include <stdio.h>
int main(void)
{
    double complex z = 1 + 2*I;
    z = 1 / z;
    printf("1/(1.0+2.0i) = %.1f%+.1fi\n", creal(z), cimag(z));
}

출력:

1/(1.0+2.0i) = 0.2-0.4i

매크로 상수 __STDC_NO_COMPLEX__ 가 구현에 의해 정의된 경우, 복소수 타입(및 라이브러리 헤더 <complex.h> )은 제공되지 않습니다.

(C11부터)

각 복소수 타입은 해당 실수 타입의 요소 두 개로 이루어진 배열 과 동일한 객체 표현 정렬 요구사항 을 가집니다 ( float 에 대해서는 float complex , double 에 대해서는 double complex , long double 에 대해서는 long double complex ). 배열의 첫 번째 요소는 실수부를, 두 번째 요소는 허수부를 담고 있습니다.

float a[4] = {1, 2, 3, 4};
float complex z1, z2;
memcpy(&z1, a, sizeof z1); // z1은 1.0 + 2.0i가 됨
memcpy(&z2, a+2, sizeof z2); // z2는 3.0 + 4.0i가 됨

복소수는 산술 연산자 + - * / 와 함께 사용될 수 있으며, 허수와 실수와 혼합하여 사용 가능합니다. 복소수를 위한 많은 수학 함수들이 <complex.h> 에 정의되어 있습니다. 내장 연산자와 라이브러리 함수 모두 errno 를 설정하고 부동 소수점 예외를 발생시킬 수 있으며, 이는 math_errhandling 에 설명된 대로 처리됩니다.

복소수 타입에 대해서는 증감 연산이 정의되어 있지 않습니다.

관계 연산자는 복소수 타입에 대해 정의되지 않습니다 ("보다 작음"의 개념이 없습니다).

암시적 변환 are defined between complex types and other arithmetic types.

복소수 연산의 one-infinity 모델을 지원하기 위해, C는 적어도 한 부분이 무한대인 모든 복소수 값을 NaN인 다른 부분이 있더라도 무한대로 간주하며, 모든 연산자와 함수가 무한대의 기본 속성을 준수하도록 보장하고 cproj 를 통해 모든 무한대를 표준 무한대로 매핑합니다 (정확한 규칙은 arithmetic operators 를 참조하십시오).

#include <complex.h>
#include <math.h>
#include <stdio.h>
int main(void)
{
    double complex z = (1 + 0*I) * (INFINITY + I*INFINITY);
//  교과서 공식으로는
//  (1+i0)(∞+i∞) ⇒ (1×∞ – 0×∞) + i(0×∞+1×∞) ⇒ NaN + I*NaN
//  이지만 C는 복소수 무한대를 제공함
    printf("%f%+f*i\n", creal(z), cimag(z));
//  교과서 공식으로는
//  cexp(∞+iNaN) ⇒ exp(∞)×(cis(NaN)) ⇒ NaN + I*NaN
//  이지만 C는 ±∞+i*nan을 제공함
    double complex y = cexp(INFINITY + I*NAN);
    printf("%f%+f*i\n", creal(y), cimag(y));
}

가능한 출력:

inf+inf*i 
inf+nan*i

C++는 데카르트 표현의 본질적 한계에도 불구하고, 가능한 경우 방향 정보를 보존하기 위해 여러 무한대를 다음과 같이 처리합니다:

허수 단위에 실수 무한대를 곱하면 올바른 부호의 허수 무한대가 됩니다: i × ∞ = i∞. 또한, i × (∞ – i∞) = ∞ + i∞는 적절한 사분면을 나타냅니다.

허수 부동 소수점 타입

허수 부동 소수점 유형은 수학적 허수 를 모델링합니다. 즉, 실수에 허수 단위를 곱한 형태로 쓸 수 있는 숫자들입니다: bi 세 가지 허수 유형은 다음과 같습니다

참고: 모든 타입 지정자와 마찬가지로 순서는 임의로 지정할 수 있습니다: long double imaginary , imaginary long double , 그리고 심지어 double imaginary long 도 모두 동일한 타입을 나타냅니다.

#include <complex.h>
#include <stdio.h>
int main(void)
{
    double imaginary z = 3*I;
    z = 1 / z;
    printf("1/(3.0i) = %+.1fi\n", cimag(z));
}

출력:

1/(3.0i) = -0.3i

__STDC_IEC_559_COMPLEX__를 정의하는 구현은 허수 지원을 권장하지만 필수는 아닙니다. POSIX는 매크로 _Imaginary_I 가 정의되어 있는지 확인하여 허수 지원을 식별할 것을 권장합니다.

(until C11)

허수 지원은 __STDC_IEC_559_COMPLEX__ (until C23) __STDC_IEC_60559_COMPLEX__ (since C23) 가 정의된 경우 제공됩니다.

(since C11)

세 가지 허수 타입 각각은 동일한 객체 표현 정렬 요구사항 을 해당 실수 타입 ( float 에 대응하는 float imaginary , double 에 대응하는 double imaginary , long double 에 대응하는 long double imaginary )을 가집니다.

참고: 그럼에도 불구하고, 허수 타입은 구별되며 해당 실수 타입과 호환되지 않아 별칭 지정(aliasing)을 금지합니다.

허수는 산술 연산자 + - * / 와 함께 사용될 수 있으며, 복소수 및 실수와 혼합 사용될 수 있습니다. 허수에 대해 정의된 많은 수학 함수들이 <complex.h> 에 있습니다. 내장 연산자와 라이브러리 함수 모두 errno 를 설정하고 부동 소수점 예외를 발생시킬 수 있으며, 이는 math_errhandling 에 설명된 대로 처리됩니다.

증감 연산은 허수 타입에 대해 정의되지 않습니다.

암시적 변환 are defined between imaginary types and other arithmetic types.

허수 타입을 사용하면 자연스러운 표기법 x + I * y (여기서 I _Imaginary_I 로 정의됨)를 사용하여 모든 복소수를 표현할 수 있습니다. 허수 타입이 없으면 특정한 복소수 값을 자연스럽게 생성할 수 없습니다. 예를 들어, I _Complex_I 로 정의된 경우, 0.0 + I * INFINITY 을 작성하면 실수부가 NaN이 되며, 대신 CMPLX ( 0.0 , INFINITY ) 을 사용해야 합니다. 이와 마찬가지로 음의 영 허수 성분을 가진 숫자들도 csqrt 와 같은 분기 절단을 갖는 라이브러리 함수를 다룰 때 의미가 있습니다: 1.0 - 0.0 * I I _Complex_I 로 정의된 경우 양의 영 허수 성분을 결과로 내며, 음의 영 허수 성분을 얻기 위해서는 CMPLX 또는 conj 를 사용해야 합니다.

허수 타입은 구현도 단순화합니다; 허수 타입이 지원되면 허수와 복소수의 곱셈을 두 번의 곱셈으로 간단히 구현할 수 있으며, 네 번의 곱셈과 두 번의 덧셈이 필요하지 않습니다.

(C99 이후)

키워드

**참고:** 주어진 지침에 따라 모든 C++ 키워드와 HTML 태그는 원본 그대로 유지되었으며, 번역할 일반 텍스트가 없어 내용에 변화가 없습니다.

값의 범위

다음 표는 일반적인 숫자 표현의 한계에 대한 참조를 제공합니다.

C23 이전에는 C 표준은 모든 부호 있는 정수 표현을 허용했으며, N비트 부호 있는 정수의 최소 보장 범위는 -(2 N-1
-1)
부터 +2 N-1
-1
까지였습니다(예: -127 부터 127 까지, 8비트 부호 있는 타입의 경우). 이는 1의 보수(one's complement) 또는 부호-크기(sign-and-magnitude) 표현 방식의 한계에 해당합니다.

그러나 모든 인기 있는 데이터 모델(ILP32, LP32, LP64, LLP64 모두 포함)과 거의 모든 C 컴파일러는 2의 보수 표현을 사용하며(유일하게 알려진 예외는 UNISYS용 일부 컴파일러임), C23 기준으로 표준에서 허용하는 유일한 표현 방식이며, 보장된 범위는 -2 N-1
부터 +2 N-1
-1
까지입니다(예: -128 부터 127 까지, 부호 있는 8비트 타입의 경우).

유형 비트 크기 형식 값 범위
근사값 정확한 값
문자 8 signed −128 ~ 127
unsigned 0 ~ 255
16 UTF-16 0 ~ 65535
32 UTF-32 0 ~ 1114111 ( 0x10ffff )
정수 16 signed ± 3.27 · 10 4 −32768 ~ 32767
unsigned 0 ~ 6.55 · 10 4 0 ~ 65535
32 signed ± 2.14 · 10 9 −2,147,483,648 ~ 2,147,483,647
unsigned 0 ~ 4.29 · 10 9 0 ~ 4,294,967,295
64 signed ± 9.22 · 10 18 −9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
unsigned 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
십진
부동소수점
32 IEEE-754
  • 최소 서브노멀:
    ± 1 · 10 -101
  • 최소 노멀:
    ± 1 · 10 -95
  • 최대:
    ± 9.999'999 · 10 96
64 IEEE-754
  • 최소 서브노멀:
    ± 1 · 10 -398
  • 최소 노멀:
    ± 1 · 10 -383
  • 최대:
    ± 9.999'999'999'999'999 · 10 384
128 IEEE-754
  • 최소 서브노멀:
    ± 1 · 10 -6176
  • 최소 노멀:
    ± 1 · 10 -6143
  • 최대:
    ± 9.999'999'999'999'999'999'
    999'999'999'999'999 · 10 6144
  1. 객체 표현은 일반적으로 32/64비트 플랫폼에서 각각 96/128비트를 차지합니다.

참고: 보장된 최솟값이 아닌 실제 범위는 라이브러리 헤더 <limits.h> <float.h> 에서 확인할 수 있습니다.

참고 항목

C++ documentation for Fundamental types