수색…
Char는 서명되지 않거나 서명 될 수 있습니다.
표준에서는 char
부호를 붙이거나 부호를 지정해야하는지 여부를 지정하지 않습니다. 다른 컴파일러는이를 다르게 구현하거나 명령 줄 스위치를 사용하여이를 변경할 수 있습니다.
정수형의 크기
다음 유형은 정수 유형으로 정의됩니다.
-
char
- 부호있는 정수 유형
- 부호없는 정수 유형
-
char16_t
및char32_t
-
bool
-
wchar_t
를 제외하고 sizeof(char)
/ sizeof(signed char)
/ sizeof(unsigned char)
§ 3.9.1.1 사이에 분할하고, [basic.fundamental은 / 1] 5.3.3.1 [expr.sizeof] 및 § sizeof(bool)
은 전체 구현 정의이며 최소 크기가 없으므로이 유형의 최소 크기 요구 사항은 표준의 § 3.9.1 [기본. 기본]에 나와 있으며 아래에서 자세히 설명합니다.
char
크기
C ++ 표준의 모든 버전은, § 5.3.3.1에서 지정하는 sizeof
수익률 1
에 대한 unsigned char
, signed char
및 char
(그것은 여부를 정의 구현 char
유형이있다 signed
또는 unsigned
).
char
는 UTF-8 코드 단위를 저장하는 데 적합하도록 256 개의 서로 다른 값을 나타낼만큼 충분히 큽니다.
부호있는 및 부호없는 정수 유형의 크기
이 표준은 3.9.1.2 절에서 signed char
, short int
, int
, long int
및 long long int
로 구성된 표준 부호있는 정수 유형 목록에서 각 유형이 적어도 앞의 목록에 있습니다. 또한 §3.9.1.3에 명시된 바와 같이 이러한 각 유형에는 대응하는 표준 부호없는 정수 유형 , unsigned char
, unsigned short int
, unsigned int
, unsigned long int
및 unsigned long long int
가 있으며 크기 및 정렬은 해당 서명 된 유형. 또한 § 3.9.1.1에 명시된 바와 같이 char
은 signed char
및 unsigned char
와 동일한 크기 및 정렬 요구 사항을가집니다.
C ++ 11 이전에는 long long
과 unsigned long long
이 공식적으로 C ++ 표준의 일부가 아니 었습니다. 그러나 C에 소개 된 이후 C99에서 많은 컴파일러는 확장 된 부호있는 정수 유형 으로 long long
을 지원하고 C 유형과 동일한 규칙을 사용하여 unsigned long long
으로 확장 된 부호없는 정수 유형 을 지원합니다.
따라서 표준은 다음을 보장합니다 :
1 == sizeof(char) == sizeof(signed char) == sizeof(unsigned char)
<= sizeof(short) == sizeof(unsigned short)
<= sizeof(int) == sizeof(unsigned int)
<= sizeof(long) == sizeof(unsigned long)
<= sizeof(long long) == sizeof(unsigned long long)
각 유형에 대한 특정 최소 크기는 표준에 의해 제공되지 않습니다. 대신, 각 유형은 지원할 수있는 최소 값 범위를 가지며, 이는 §5.2.4.2.1의 C 표준에서 상속 된 § 3.9.1.3에 지정된대로입니다. 각 유형의 최소 크기는 필요한 최소 비트 수를 결정하여이 범위에서 대략 추측 할 수 있습니다. 주어진 플랫폼에 따라 유형의 실제 지원 범위가 최소값보다 클 수 있습니다. 부호 첨부 형의 경우, 범위는 일반적으로 사용되는 2의 보수가 아니라, 1의 보수에 대응하고 있습니다. 이는 더 넓은 범위의 플랫폼이 표준을 준수 할 수 있도록하기위한 것입니다.
유형 | 최소 범위 | 최소 비트 필요 |
---|---|---|
signed char | -127 ~ 127 (- (2 7 -1) ~ (2 7 -1)) | 8 |
unsigned char | 0 ~ 255 (0 ~ 2 8 - 1) | 8 |
signed short | -32,767 내지 32,767 (- (2 15 -1) 내지 (2 15 -1)) | 16 |
unsigned short | 0 (1 - 0 16 2) 65,535 | 16 |
signed int | -32,767 내지 32,767 (- (2 15 -1) 내지 (2 15 -1)) | 16 |
unsigned int | 0 (1 - 0 16 2) 65,535 | 16 |
signed long | -2,147,483,647 내지 2,147,483,647 (- (2 31 -1) 내지 (2 31 -1)) | 32 |
unsigned long | 0 ~ 4,294,967,295 (0 ~ 2 32 - 1) | 32 |
유형 | 최소 범위 | 최소 비트 필요 |
---|---|---|
signed long long | -9,223,372,036,854,775,807 9,223,372,036,854,775,807에 (- (263 - 1) ~ (263 - 1)) | 64 개 |
unsigned long long | 0 ~ 18,446,744,073,709,551,615 (0 ~ 2 64 -1) | 64 개 |
각 유형이 최소 크기 요구 사항보다 클 수 있으므로 유형은 구현간에 다를 수 있습니다. 가장 주목할만한 예는 LLP64 시스템 (예 : 64 비트 Windows)이 32 비트 ints
및 long
s이고 LP64 시스템 (64 비트 Linux 등)이있는 64 비트 데이터 모델 LP64 및 LLP64의 경우입니다. 32 비트 int
및 64 비트 long
이 때문에 정수 유형은 모든 플랫폼에서 고정 폭을 갖는 것으로 가정 할 수 없습니다.
고정 너비가있는 정수 유형이 필요한 경우 <cstdint>
헤더의 유형을 사용하지만 표준에서 int8_t
, int16_t
, int32_t
, int64_t
, intptr_t
, uint8_t
, uint16_t
, uint32_t
, uint64_t
및 uintptr_t
.
char16_t
및 char32_t
크기
char16_t
와 char32_t
의 크기는 char16_t
에 char16_t
char32_t
에 주어진 규정에 따라 구현 정의된다.
char16_t
는 UTF-16 코드 단위를 나타 내기에 충분히 크며char16_t
와 크기, 부호uint_least16_t
및 정렬이uint_least16_t
. 따라서, 적어도 16 비트의 크기가 요구된다.char32_t
는 UTF-32 코드 단위를 나타 내기에 충분히 크며char32_t
와 크기, 부호 및 정렬이uint_least32_t
. 따라서 적어도 32 비트 크기가 요구된다.
bool
크기
bool
의 크기는 구현에 따라 정의되며 1
수도 있고 아닐 수도 있습니다.
wchar_t의 크기
§ 3.9.1.5에 명시된 바와 같이 wchar_t
는 구별 된 유형으로, 지원되는 로케일 중 가장 큰 확장 문자 집합의 모든 고유 한 코드 단위를 값 범위로 나타낼 수 있습니다. 그것은 기본 유형으로 알려진 다른 정수 유형 중 하나와 동일한 크기, 부호 매김 및 정렬을가집니다. 이 유형의 크기는 5.3.3.1 절에 정의 된대로 구현 정의되며, 예를 들어 최소 8, 16 또는 32 비트 일 수 있습니다. 예를 들어, 시스템이 유니 코드를 지원하면 wchar_t
는 32 비트 이상이어야합니다 (이 규칙의 예외는 Windows이며 wchar_t
는 호환성을 위해 16 비트 임). 이것은 C90 표준 (ISO 9899 : 1990 § 4.1.5)에서 계승되었으며, 약간의 수정이있었습니다.
구현에 따라 wchar_t
의 크기는 종종 8, 16 또는 32 비트가 될 수 있지만 대부분은 그렇지 않습니다. 가장 일반적인 예는 다음과 같습니다.
- Unix 및 Unix 계열 시스템에서
wchar_t
는 32 비트이며 일반적으로 UTF-32에 사용됩니다. - Windows에서
wchar_t
는 16 비트이며 UTF-16에 사용됩니다. - 8 비트 만 지원하는 시스템에서
wchar_t
는 8 비트입니다.
유니 코드 지원이 필요한 경우 wchar_t
를 사용하는 대신 char
을 UTF-8, char16_t
를 UTF-16 또는 char32_t
를 UTF-32로 사용하는 것이 좋습니다.
데이터 모델
위에서 언급했듯이 정수 유형의 너비는 플랫폼에 따라 다를 수 있습니다. 가장 일반적인 모델은 비트 단위로 지정된 크기로 다음과 같습니다.
모델 | int | long | 바늘 |
---|---|---|---|
LP32 (2/4/4) | 16 | 32 | 32 |
ILP32 (4/4/4) | 32 | 32 | 32 |
LLP64 (4/4/8) | 32 | 32 | 64 개 |
LP64 (4/8/8) | 32 | 64 개 | 64 개 |
이 모델들 중 :
- 16 비트 Windows에서 LP32를 사용했습니다.
- 32 비트 * nix 시스템 (Unix, Linux, Mac OSX 및 기타 유닉스 계열 OS)과 Windows는 ILP32를 사용합니다.
- 64 비트 Windows는 LLP64를 사용합니다.
- 64 비트 * nix 시스템은 LP64를 사용합니다.
그러나 이러한 모델은 표준 자체에서 특별히 언급하지 않습니다.
바이트의 비트 수
C ++에서 바이트 는 char
객체가 차지하는 공간입니다. 한 바이트의 비트 수는 CHAR_BIT
에 의해 주어진다.이 CHAR_BIT
은 climits
으로 정의되고 8 이상이어야한다. 대부분의 최신 시스템은 8 비트 바이트이고 POSIX는 CHAR_BIT
가 정확히 8이어야하지만 일부 시스템에서는 CHAR_BIT
가 8보다 큰 경우, 즉 단일 바이트가 8, 16, 32 또는 64 비트로 구성 될 수 있습니다.
포인터의 숫자 값
reinterpret_cast
사용하여 정수에 대한 포인터를 캐스팅 한 결과는 구현에 따라 정의되지만 "... 기본 시스템의 주소 지정 구조를 아는 사람들에게는 당황하지 않습니다."
int x = 42;
int* p = &x;
long addr = reinterpret_cast<long>(p);
std::cout << addr << "\n"; // prints some numeric address,
// probably in the architecture's native address format
마찬가지로 정수에서 변환하여 얻은 포인터도 구현에 따라 정의됩니다.
포인터를 정수로 저장하는 올바른 방법은 uintptr_t
또는 intptr_t
유형을 사용하는 것입니다.
// `uintptr_t` was not in C++03. It's in C99, in <stdint.h>, as an optional type
#include <stdint.h>
uintptr_t uip;
// There is an optional `std::uintptr_t` in C++11
#include <cstdint>
std::uintptr_t uip;
C ++ 11은 uintptr_t
정의에 대해 C99를 참조합니다 (C99 표준, 6.3.2.3).
void
대한 유효한 포인터를이 유형으로 변환 한 다음void
로의 포인터로 다시 변환 할 수있는 속성을 갖는 부호없는 정수 유형이며 결과는 원래 포인터와 동일하게 비교됩니다.
현대 플랫폼의 대다수의 경우 플랫 주소 공간을 사용할 수 있지만 uintptr_t
산술 연산은 char *
연산과 동일하지만 변환이 가능한 한 void *
를 uintptr_t
로 캐스트 할 때 모든 변환을 수행 할 수 있습니다 uintptr_t
에서 void *
다시 캐스트 할 때 되돌릴 수 있습니다.
기술
XSI 규격 (X / Open System Interfaces) 시스템에서는
intptr_t
및uintptr_t
유형이 필요하며 그렇지 않은 경우 선택적 입니다.C 표준의 의미 내에서 함수는 객체가 아닙니다.
uintptr_t
가 함수 포인터를 보유 할 수 있다는 것은 C 표준에 의해 보장되지 않습니다. 어쨌든 POSIX (2.12.3) 적합성은 다음을 필요로합니다 :모든 함수 포인터 형은 void 형 포인터와 같은 표현을 가져야한다. 함수 포인터를 void *로 변환해도 표현이 변경되지 않아야합니다. 이러한 변환으로 인한 void * 값은 명시 적 형변환을 사용하여 정보 손실없이 원래 함수 포인터 유형으로 다시 변환 될 수 있습니다.
C99 §7.18.1 :
초기 유의 부재 또는 존재에서만 다른 typedef 이름이 정의 될 때 6.2.5 절에 기술 된 대응하는 부호있는 유형과 부호없는 형태를 표시해야한다. 이러한 상응하는 유형 중 하나를 제공하는 구현은 다른 유형을 제공해야한다.
uintptr_t
는 부호있는 정수로 현명하게 수행 할 수없는 포인터의 비트에 일을하려는 경우 의미가 있습니다.
숫자 형의 범위
정수 유형의 범위는 구현에 따라 정의됩니다. <limits>
헤더는 모든 기본 유형의 최소값과 최대 값을 제공하는 std::numeric_limits<T>
템플릿을 제공합니다. 이 값은 <climits>
및 (> = C ++ 11) <cinttypes>
헤더를 통해 C 표준에서 제공하는 보증을 충족시킵니다.
-
std::numeric_limits<signed char>::min()
은SCHAR_MIN
과 동일하며 -127보다 작거나 같습니다. -
std::numeric_limits<signed char>::max()
는 127보다 크거나 같은SCHAR_MAX
와 같습니다. -
std::numeric_limits<unsigned char>::max()
는UCHAR_MAX
와 같UCHAR_MAX
255보다 크거나 같습니다. -
std::numeric_limits<short>::min()
은SHRT_MIN
과 동일하며 -32767보다 작거나 같습니다. -
std::numeric_limits<short>::max()
는SHRT_MAX
와 동일하며 32767보다 크거나 같습니다. -
std::numeric_limits<unsigned short>::max()
는USHRT_MAX
와 같USHRT_MAX
65535 이상입니다. -
std::numeric_limits<int>::min()
은INT_MIN
과 같고 -32767보다 작거나 같습니다. -
std::numeric_limits<int>::max()
는 32767보다 크거나 같은INT_MAX
와 같습니다. -
std::numeric_limits<unsigned int>::max()
는 65535보다 크거나 같은UINT_MAX
와 같습니다. -
std::numeric_limits<long>::min()
은LONG_MIN
과 같고 -2147483647보다 작거나 같습니다. -
std::numeric_limits<long>::max()
는 2147483647보다 크거나 같은LONG_MAX
와 같습니다. -
std::numeric_limits<unsigned long>::max()
는ULONG_MAX
와 같으며 4294967295보다 크거나 같습니다.
-
std::numeric_limits<long long>::min()
은LLONG_MIN
과 동일하며 -9223372036854775807보다 작거나 같습니다. -
std::numeric_limits<long long>::max()
는LLONG_MAX
보다 크거나 같은 LLONG_MAX와 같습니다. -
std::numeric_limits<unsigned long long>::max()
는ULLONG_MAX
와 같ULLONG_MAX
보다 크거나 같습니다.
부동 소수점 유형 T
경우 max()
는 최대 유한 값이고 min()
은 최소 양의 정규화 된 값입니다. 추가 구성원은 부동 소수점 유형에 대해서도 제공되며, 이는 구현 정의이지만 <cfloat>
헤더를 통해 C 표준에서 제공하는 특정 보증을 충족합니다.
- member
digits10
은 십진수로 정밀도의 수를 제공합니다.-
std::numeric_limits<float>::digits10
은FLT_DIG
와 같FLT_DIG
6 이상입니다. -
std::numeric_limits<double>::digits10
은DBL_DIG
와 동일하며 최소 10입니다. -
std::numeric_limits<long double>::digits10
은LDBL_DIG
와 동일하며 최소 10입니다.
-
- 구성원
min_exponent10
은 최소 음의 E이며, 따라서 E는 10을 지수로합니다.-
std::numeric_limits<float>::min_exponent10
은FLT_MIN_10_EXP
와 같FLT_MIN_10_EXP
-37 이하입니다. -
std::numeric_limits<double>::min_exponent10
은DBL_MIN_10_EXP
와 같DBL_MIN_10_EXP
-37 이하입니다.std::numeric_limits<long double>::min_exponent10
은LDBL_MIN_10_EXP
와 같LDBL_MIN_10_EXP
-37 이하입니다.
-
- 멤버
max_exponent10
은 힘 E에 대한 10이 유한 한 최대 E이다.-
std::numeric_limits<float>::max_exponent10
동일FLT_MIN_10_EXP
적어도 37이다. -
std::numeric_limits<double>::max_exponent10
동일DBL_MIN_10_EXP
적어도 37이다. -
std::numeric_limits<long double>::max_exponent10
은LDBL_MIN_10_EXP
와 같LDBL_MIN_10_EXP
최소 37입니다.
-
- 멤버
is_iec559
가 true 인 경우 유형은 IEC 559 / IEEE 754를 따르므로 해당 범위가 해당 표준에 따라 결정됩니다.
부동 소수점 유형의 값 표현
이 표준은 long double
이 적어도 float
만큼 정밀도를 제공하는 double
만큼의 정밀도를 제공해야한다고 요구합니다. 하고있는 long double
상관 값을 나타낼 수있는 double
잠시 나타낼 수 있습니다을 double
• 그래도 값 나타낼 수 float
나타낼 수 있습니다. 그러나 표현의 세부 사항은 구현에 따라 정의됩니다.
부동 소수점 타입 T
경우 std::numeric_limits<T>::radix
는 T
표현에 사용 된 std::numeric_limits<T>::radix
지정합니다.
std::numeric_limits<T>::is_iec559
가 true이면 T
표현은 IEC 559 / IEEE 754에 정의 된 형식 중 하나와 일치합니다.
정수에서 부호있는 정수로 변환 할 때 오버플로
부호있는 또는 부호없는 정수가 부호있는 정수 유형으로 변환되고 그 값이 대상 유형에서 표현할 수없는 경우 생성 된 값은 구현에 따라 정의됩니다. 예:
// Suppose that on this implementation, the range of signed char is -128 to +127 and
// the range of unsigned char is 0 to 255
int x = 12345;
signed char sc = x; // sc has an implementation-defined value
unsigned char uc = x; // uc is initialized to 57 (i.e., 12345 modulo 256)
열거 형의 기본 유형 (따라서 크기)
범위가없는 열거 형에 대해 기본 유형이 명시 적으로 지정되지 않은 경우 구현 정의 방식으로 결정됩니다.
enum E {
RED,
GREEN,
BLUE,
};
using T = std::underlying_type<E>::type; // implementation-defined
그러나 int
및 unsigned int
가 열거 형의 모든 값을 나타낼 수 unsigned int
경우를 제외하고는 표준에서 열거 형의 기본 유형이 int
보다 크지 않아야합니다. 따라서, 위의 코드에서, T
수 int
, unsigned int
, 또는 short
,하지만 long long
몇 가지 예를 제공.
열거 형은 기본 유형과 동일한 크기 ( sizeof
의해 반환 됨) sizeof
집니다.