[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 :
signed char
: -127 ~ 127 (참고 : -128 ~ 127이 아니라 1의 보수 및 부호 및 크기 플랫폼을 수용 함)unsigned char
: 0 ~ 255- “plain”
char
:signed char
또는 범위와 동일 범위unsigned char
, 구현 정의 signed short
: -32767 ~ 32767unsigned short
: 0 ~ 65535signed int
: -32767 ~ 32767unsigned int
: 0 ~ 65535signed long
: -2147483647 ~ 2147483647unsigned long
: 0 ~ 4294967295signed long long
: -9223372036854775807 ~ 9223372036854775807unsigned long long
: 0-18446744073709551615
C ++ (또는 C) 구현은 유형의 크기를 바이트 단위 sizeof(type)
로 모든 값 에 대해 정의 할 수 있습니다
- 이 식은
sizeof(type) * CHAR_BIT
필요한 범위를 포함 할 수있을 정도로 높은 비트 수로 평가되며 - 유형의 순서는 여전히 유효합니다 (예 🙂
sizeof(int) <= sizeof(long)
.
이 모든 것을 종합하면 다음이 보장됩니다.
char
,signed char
그리고unsigned char
적어도 8 비트signed short
,unsigned short
,signed int
및unsigned 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입니다. int
즉 long
, 포인터는 모두 32 비트 수량입니다.
64 비트 시스템의 경우 기본 Unix ‘실제’표준은 LP64 long
이며 포인터는 64 비트 ( int
32 비트)입니다. – 윈도우 64 비트 표준은 LLP64이다 long long
포인터는 64 비트이다 (그러나 long
및 int
32 비트이다).
한 번에 일부 Unix 시스템은 ILP64 조직을 사용했습니다.
이러한 사실상의 표준 중 어느 것도 C 표준 (ISO / IEC 9899 : 1999)에 의해 제정되지는 않지만 모든 표준에 의해 허용됩니다.
그리고, 정의, sizeof(char)
인 1
펄 구성 스크립트 테스트에도 불구하고,.
기계 (Crays)가 있었다하는 것으로 CHAR_BIT
의미 그건 8. IIRC보다 훨씬 더이었다, sizeof(int)
또한 1이었고, 때문에 모두 char
와 int
있었다 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_t
8 비트, int16_t
16 비트 등을 보장합니다.
답변
답변
업데이트 : 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>
.
결론 : 작업중인 아키텍처에 따라 다릅니다. 다른 가정은 거짓입니다.