Arithmetic types
(참고: type - 타입 시스템 개요 및 C 라이브러리에서 제공하는 타입 관련 유틸리티 목록 참조)
불리언 타입변환 이 _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 으로도 접근 가능)
|
(C99부터) |
|
(C23부터) |
참고: 모든 타입 지정자와 마찬가지로 순서는 상관없습니다: unsigned long long int 와 long int unsigned long 는 동일한 타입을 지정합니다.
다음 표는 사용 가능한 모든 정수형과 그 속성을 요약한 것입니다:
| 형식 지정자 | 동등한 형식 | 데이터 모델별 비트 너비 | ||||
|---|---|---|---|---|---|---|
| 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 로 구현합니다).
|
(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 도 모두 동일한 타입을 나타냅니다.
이 코드 실행
출력: 1/(1.0+2.0i) = 0.2-0.4i
각 복소수 타입은 해당 실수 타입의 요소 두 개로 이루어진 배열 과 동일한 객체 표현 과 정렬 요구사항 을 가집니다 ( float 에 대해서는 float complex , double 에 대해서는 double complex , long double 에 대해서는 long double complex ). 배열의 첫 번째 요소는 실수부를, 두 번째 요소는 허수부를 담고 있습니다.
복소수는
산술 연산자
복소수 타입에 대해서는 증감 연산이 정의되어 있지 않습니다. 관계 연산자는 복소수 타입에 대해 정의되지 않습니다 ("보다 작음"의 개념이 없습니다).
복소수 연산의 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 도 모두 동일한 타입을 나타냅니다.
이 코드 실행
출력: 1/(3.0i) = -0.3i
세 가지 허수 타입 각각은 동일한 객체 표현 과 정렬 요구사항 을 해당 실수 타입 ( float 에 대응하는 float imaginary , double 에 대응하는 double imaginary , long double 에 대응하는 long double imaginary )을 가집니다. 참고: 그럼에도 불구하고, 허수 타입은 구별되며 해당 실수 타입과 호환되지 않아 별칭 지정(aliasing)을 금지합니다.
허수는
산술 연산자
증감 연산은 허수 타입에 대해 정의되지 않습니다.
허수 타입을 사용하면 자연스러운 표기법 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 이후) |
키워드
- bool , true , false , char , int , short , long , signed , unsigned , float , double .
- _Bool , _BitInt , _Complex , _Imaginary , _Decimal32 , _Decimal64 , _Decimal128 .
값의 범위
다음 표는 일반적인 숫자 표현의 한계에 대한 참조를 제공합니다.
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 |
|
|
| 64 | IEEE-754 |
|
|
|
| 80 [참고 1] | x86 |
|
|
|
| 128 | IEEE-754 |
|
|
|
|
십진
부동소수점 |
32 | IEEE-754 |
|
|
| 64 | IEEE-754 |
|
||
| 128 | IEEE-754 |
|
||
- ↑ 객체 표현은 일반적으로 32/64비트 플랫폼에서 각각 96/128비트를 차지합니다.
참고: 보장된 최솟값이 아닌 실제 범위는 라이브러리 헤더 <limits.h> 와 <float.h> 에서 확인할 수 있습니다.
참고 항목
|
C++ documentation
for
Fundamental types
|