[c++] C ++ 표준은 int, long 유형의 크기를 무엇이라고 말합니까?

기본 C ++ 유형의 크기에 대한 자세한 정보를 찾고 있습니다. 아키텍처 (16 비트, 32 비트, 64 비트)와 컴파일러에 따라 다릅니다.

그러나 C ++에 대한 표준이 있습니까?

32 비트 아키텍처에서 Visual Studio 2008을 사용하고 있습니다. 내가 얻는 것은 다음과 같습니다.

char  : 1 byte
short : 2 bytes
int   : 4 bytes
long  : 4 bytes
float : 4 bytes
double: 8 bytes

나는의 크기를 나타 신뢰할 수있는 정보를, 많은 성공없이 찾을려고 char, short, int, long, double, float다른 아키텍처와 컴파일러에서 (그리고 다른 종류의 내가 생각하지 않았다).



답변

C ++ 표준은 정수 유형의 크기를 바이트 단위로 지정하지 않지만 보유 할 수있는 최소 범위를 지정합니다. 필요한 범위에서 최소 크기를 비트 단위로 추론 할 수 있습니다. 바이트 단위 로 비트 수CHAR_BIT정의하는 매크로 값과 그 값에서 최소 바이트 크기를 유추 할 수 있습니다 . 가장 애매 모호한 플랫폼을 제외하고는 8이고 8보다 작을 수 없습니다. “유니 코드 UTF-8 인코딩 형식의 8 비트 코드 단위”를 보유 할 수있을만큼 커야하기 때문입니다.

하나의 추가 제약 조건 char은 크기가 항상 1 바이트 또는 CHAR_BIT비트 (따라서 이름)라는 것입니다. 이것은 표준에 명시 적으로 명시되어 있습니다.

C 표준은 C ++ 표준에 대한 규범적인 참조 이므로 이러한 요구 사항을 명시 적으로 명시하지 않더라도 C ++에는 C 표준 (22 페이지)에 필요한 최소 범위가 필요합니다 . MSDN :

  1. signed char: -127 ~ 127 (참고 : -128 ~ 127이 아니라 1의 보수 및 부호 및 크기 플랫폼을 수용 함)
  2. unsigned char: 0 ~ 255
  3. “plain” char: signed char또는 범위와 동일 범위 unsigned char, 구현 정의
  4. signed short: -32767 ~ 32767
  5. unsigned short: 0 ~ 65535
  6. signed int: -32767 ~ 32767
  7. unsigned int: 0 ~ 65535
  8. signed long: -2147483647 ~ 2147483647
  9. unsigned long: 0 ~ 4294967295
  10. signed long long: -9223372036854775807 ~ 9223372036854775807
  11. unsigned long long: 0-18446744073709551615

C ++ (또는 C) 구현은 유형의 크기를 바이트 단위 sizeof(type)로 모든 값 에 대해 정의 할 수 있습니다

  1. 이 식은 sizeof(type) * CHAR_BIT필요한 범위를 포함 할 수있을 정도로 높은 비트 수로 평가되며
  2. 유형의 순서는 여전히 유효합니다 (예 🙂 sizeof(int) <= sizeof(long).

이 모든 것을 종합하면 다음이 보장됩니다.

  • char, signed char그리고 unsigned char적어도 8 비트
  • signed short, unsigned short, signed intunsigned int적어도 16 비트이다
  • signed long그리고 unsigned long적어도 32 비트이다
  • signed long long그리고 unsigned long long적어도 64 비트이다

크기 float나 크기를 double제외하고 double는 최소 정밀도를 제공하지 않습니다 float.

실제 구현 별 범위는 <limits.h>C의 헤더 또는 <climits>C ++ (또는 더 나은 헤더 에서 템플릿 화) std::numeric_limits에서 찾을 수 있습니다 <limits>.

예를 들어, 다음에 대한 최대 범위를 찾는 방법입니다 int.

씨:

#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;

C ++ :

#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();


답변

32 비트 시스템의 경우 ‘사실상’표준은 ILP32입니다. intlong, 포인터는 모두 32 비트 수량입니다.

64 비트 시스템의 경우 기본 Unix ‘실제’표준은 LP64 long이며 포인터는 64 비트 ( int32 비트)입니다. – 윈도우 64 비트 표준은 LLP64이다 long long포인터는 64 비트이다 (그러나 longint32 비트이다).

한 번에 일부 Unix 시스템은 ILP64 조직을 사용했습니다.

이러한 사실상의 표준 중 어느 것도 C 표준 (ISO / IEC 9899 : 1999)에 의해 제정되지는 않지만 모든 표준에 의해 허용됩니다.

그리고, 정의, sizeof(char)1펄 구성 스크립트 테스트에도 불구하고,.

기계 (Crays)가 있었다하는 것으로 CHAR_BIT의미 그건 8. IIRC보다 훨씬 더이었다, sizeof(int)또한 1이었고, 때문에 모두 charint있었다 32 비트.


답변

실제로는 그런 것이 없습니다. std::size_t현재 아키텍처에서 부호없는 고유 정수 크기를 나타내는 경우가 종종 있습니다 . 즉 16 비트, 32 비트 또는 64 비트이지만이 답변에 대한 의견에서 지적한 것처럼 항상 그런 것은 아닙니다.

다른 모든 내장 유형은 컴파일러에 따라 다릅니다. 최신 C ++ 표준의 현재 작업 초안에서 발췌 한 두 가지 발췌가 있습니다.

부호있는 char, short int, int, long int 및 long long int의 5 가지 표준 부호있는 정수 유형이 있습니다. 이 목록에서 각 유형은 목록에서 이전 유형보다 최소한 많은 스토리지를 제공합니다.

각 표준 부호있는 정수 유형에 대해 대응하는 (그러나 다른) 표준 부호없는 정수 유형이 있습니다 : 부호없는 char, 부호없는 short int, 부호없는 int, 부호없는 long int 및 부호없는 long long int 스토리지와 동일한 정렬 요구 사항이 있습니다.

원하는 경우 이러한 기본 유형의 크기를 정적으로 (컴파일 타임) 어설 션 할 수 있습니다. 가정의 크기가 변경되면 사람들에게 코드 이식에 대해 생각하도록 경고합니다.


답변

표준이 있습니다.

C90 표준은

sizeof(short) <= sizeof(int) <= sizeof(long)

C99 표준은

sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

C99 사양은 다음과 같습니다 . 다양한 적분 유형의 크기에 대해 자세히 설명합니다.

다음은 Windows 플랫폼 용 int 유형 크기 (비트)입니다.

Type           C99 Minimum     Windows 32bit
char           8               8
short          16              16
int            16              32
long           32              32
long long      64              64

이식성이 염려되거나 유형의 이름이 크기를 반영하도록 <inttypes.h>하려면 다음 매크로를 사용할 수 있는 header 를 볼 수 있습니다.

int8_t
int16_t
int32_t
int64_t

int8_t8 비트, int16_t16 비트 등을 보장합니다.


답변

고정 크기 유형이 필요한 경우 stdint.h에 정의 된 uint32_t (부호없는 정수 32 비트)와 같은 유형을 사용하십시오 . 그것들은 C99 에 지정되어 있습니다.


답변

업데이트 : C ++ 11은 공식적으로 TR1의 유형을 표준으로 가져 왔습니다.

  • long long int
  • 부호없는 long long int

그리고 “크기”유형에서 <cstdint>

  • int8_t
  • int16_t
  • int32_t
  • int64_t
  • (서명되지 않은 상대방).

게다가 당신은 얻을 :

  • int_least8_t
  • int_least16_t
  • int_least32_t
  • int_least64_t
  • 또한 서명되지 않은 상대방도 있습니다.

이 타입들은 최소한 지정된 비트 수를 가진 가장 작은 정수 타입을 나타냅니다. 마찬가지로 최소한 지정된 비트 수를 가진 “가장 빠른”정수 유형이 있습니다.

  • int_fast8_t
  • int_fast16_t
  • int_fast32_t
  • int_fast64_t
  • 부호없는 버전도 있습니다.

“빠른”의 의미는 무엇이든 구현에 달려 있습니다. 모든 목적을 위해 가장 빠를 필요는 없습니다.


답변

C ++ 표준 이처럼 말한다 :

3.9.1, §2 :

“signed char”, “short int”, “int”, “long int”및 “long long int”의 5 가지 부호있는 정수 유형이 있습니다. 이 목록에서 각 유형은 목록에서 이전 유형보다 최소한 많은 스토리지를 제공합니다. 일반 정수는 실행 환경의 아키텍처 (44)에 의해 제안 된 자연스러운 크기를 가지고 있습니다. 다른 부호있는 정수 유형은 특별한 요구를 충족시키기 위해 제공됩니다.

(44) 즉 , 헤더에 정의 된대로 INT_MIN 및 INT_MAX 범위의 값을 포함하기에 충분히 큽니다
<climits>
.

결론 : 작업중인 아키텍처에 따라 다릅니다. 다른 가정은 거짓입니다.