수색…


Char는 서명되지 않거나 서명 될 수 있습니다.

표준에서는 char 부호를 붙이거나 부호를 지정해야하는지 여부를 지정하지 않습니다. 다른 컴파일러는이를 다르게 구현하거나 명령 줄 스위치를 사용하여이를 변경할 수 있습니다.

정수형의 크기

다음 유형은 정수 유형으로 정의됩니다.

  • char
  • 부호있는 정수 유형
  • 부호없는 정수 유형
  • char16_tchar32_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 charchar (그것은 여부를 정의 구현 char 유형이있다 signed 또는 unsigned ).

C ++ 14

char 는 UTF-8 코드 단위를 저장하는 데 적합하도록 256 개의 서로 다른 값을 나타낼만큼 충분히 큽니다.

부호있는 및 부호없는 정수 유형의 크기

이 표준은 3.9.1.2 절에서 signed char , short int , int , long intlong long int 로 구성된 표준 부호있는 정수 유형 목록에서 각 유형이 적어도 앞의 목록에 있습니다. 또한 §3.9.1.3에 명시된 바와 같이 이러한 각 유형에는 대응하는 표준 부호없는 정수 유형 , unsigned char , unsigned short int , unsigned int , unsigned long intunsigned long long int 가 있으며 크기 및 정렬은 해당 서명 된 유형. 또한 § 3.9.1.1에 명시된 바와 같이 charsigned charunsigned char 와 동일한 크기 및 정렬 요구 사항을가집니다.

C ++ 11

C ++ 11 이전에는 long longunsigned 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)
C ++ 11
 <= 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
C ++ 11
유형 최소 범위 최소 비트 필요
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 비트 intslong s이고 LP64 시스템 (64 비트 Linux 등)이있는 64 비트 데이터 모델 LP64 및 LLP64의 경우입니다. 32 비트 int 및 64 비트 long 이 때문에 정수 유형은 모든 플랫폼에서 고정 폭을 갖는 것으로 가정 할 수 없습니다.

C ++ 11

고정 너비가있는 정수 유형이 필요한 경우 <cstdint> 헤더의 유형을 사용하지만 표준에서 int8_t , int16_t , int32_t , int64_t , intptr_t , uint8_t , uint16_t , uint32_t , uint64_tuintptr_t .

C ++ 11

char16_tchar32_t 크기

char16_tchar32_t 의 크기는 char16_tchar16_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 비트입니다.
C ++ 11

유니 코드 지원이 필요한 경우 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_BITclimits 으로 정의되고 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;
C ++ 11
// 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_tuintptr_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보다 크거나 같습니다.
C ++ 11
  • 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>::digits10FLT_DIG 와 같 FLT_DIG 6 이상입니다.
    • std::numeric_limits<double>::digits10DBL_DIG 와 동일하며 최소 10입니다.
    • std::numeric_limits<long double>::digits10LDBL_DIG 와 동일하며 최소 10입니다.
  • 구성원 min_exponent10 은 최소 음의 E이며, 따라서 E는 10을 지수로합니다.
    • std::numeric_limits<float>::min_exponent10FLT_MIN_10_EXP 와 같 FLT_MIN_10_EXP -37 이하입니다.
    • std::numeric_limits<double>::min_exponent10DBL_MIN_10_EXP 와 같 DBL_MIN_10_EXP -37 이하입니다. std::numeric_limits<long double>::min_exponent10LDBL_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_exponent10LDBL_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>::radixT 표현에 사용 된 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

그러나 intunsigned int 가 열거 형의 모든 값을 나타낼 수 unsigned int 경우를 제외하고는 표준에서 열거 형의 기본 유형이 int 보다 크지 않아야합니다. 따라서, 위의 코드에서, Tint , unsigned int , 또는 short ,하지만 long long 몇 가지 예를 제공.

열거 형은 기본 유형과 동일한 크기 ( sizeof 의해 반환 됨) sizeof 집니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow