2013-08-02 2 views
1

이 질문은 다소 간단한 코딩을 수행하는 동안 다음과 같이 고려해야합니다. 예상대로C++ 11, 정수 유형은 범위로 결정됩니까?

for(unsigned int x=0x00000000; x<0xFFFFFFFF; x++) 
{ 
    // ... 
} 

위의 코드, 가정 작품 '를 sizeof 연산자를 (부호없는 int)를> = 4'우리가 아는 한, 그러나, 일부 플랫폼에서이 사실이 될 수 없습니다, 따라서 나는 모두이 일에 interrested 해요; 'RangeInt'는 템플릿이 '타입'는 최대 MINIMUM (0x00000000의()을 0xFFFFFFFF)에서 값의 범위를 유지하기에 충분히 큰 최소 정수 타입이다

for(RangeBasedInt<0x00000000, 0xFFFFFFFF>::type x=0x00000000; x<0xFFFFFFFF; x++) 
{ 
    // ... 
} 

;

template<int MINIMUM, int MAXIMUM> 
struct RangeBasedInt 
{ 
    // Type based upon MINIMUM and MAXIMUM 
    typedef /* MAGIC */ type; 
}; 

질문은 간단합니다.

  1. 표준 라이브러리의 어딘가에 구현되어 있습니까?
  2. 되지 않은 경우,이를 구현하는 라이브러리가있다, 또는 나는이 자신을 구현하기 정말 쉽게 내 자신의 표준에 따라 :: numeric_limits

답변

2

을 구축해야합니다. 그래서 쉽게 나는 그것이 언어로 구현 말하고 싶지만 :

typedef decltype(0xFFFFFFFF) RangeBasedInt; 
for(RangeBasedInt x=0x00000000; x<0xFFFFFFFF; x++) 
{ 
    // ... 
} 

2.14.2은 [lex.icon] 국가 필수 리터럴의 유형 값을 보유 할 수있는 가장 작은 타입입니다. 따라서 int이 기기에 0xFFFFFFFF을 저장할 수있는 경우 RangeBasedIntint 일 수 있습니다. 내 컴퓨터에서는 unsigned int입니다.

이 특정 제한 (0xFFFFFFFF)의 경우 표준은 내장 정수 계열 유형 중 하나로 표시 될 수 있음을 보장합니다. ULONG_MAX은 4294967295 (0xFFFFFFFF) 이상이어야하며 ULLONG_MAX은 18446744073709551615 (0xFFFFFFFFFFFFFFFF) 이상이어야합니다.

업데이트

나는 전문적에 Skeen에 의해 그렇군요. [lex.icon]의 표 6은 실제로 "가장 작은 유형"을 말하지 않습니다. 실제로 말한다 리터럴은 8 진수 그것의 값이 표현 될 수있는 다음과 같은 목록의 첫 번째 유형이 될 것 진수 상수 인 경우

int 
unsigned int 
long int 
unsigned long int 
long long int 
unsigned long long int 

표가 다른 목록이 있는지 여부에 따라 지정에 간다 리터럴은 10 진수 또는 그렇지 않은지 여부와 접미사 여부를 나타냅니다. 내가 "가장 작다"고 말할 때 나는 분명히 의치 려했다. 정확한 세부 사항은 실제 표준을 참조하십시오. SO 답변 (나와 다른 사람이 아님)이 아닙니다. 이 글을 쓰면서 최신 C++ 1y 초안은 N3691입니다.

+0

하한값이 (또는 둘 다) 음수이면 어떻게 처리 할 수 ​​있습니까? – Skeen

+0

그러면 'RangeBasedInt'의 구현이 더욱 복잡해집니다. :-) 그러나 그것은 단지 당신이 그것을 만들고 싶어 복잡하게됩니다. 한도가 음수로 표현 되었다면, 리터럴 (iterate)이라고 가정하고 (그것을 리터럴이라고 가정) 여전히 'decltype'할 수 있고 그것을 나타낼 부호있는 정수 타입을 얻을 수 있습니다. 정말로 일반적인 'RangeBasedInt '을 만들고 싶다면 그렇게 할 수 있습니다. 표준 라이브러리에는 존재하지 않습니다. 그리고 decltype 많은 도움이 될 것입니다. –

+0

나는 틀렸다면, 2.14.2, 당신이 말하는 것을 진술하고, 참조로 나를 바로 잡는다.GCC와 Clang 모두 한계 (0x0, 0xFF)에 대해 int를 생성하는 것처럼 보입니다. 여기서 unsigned char은 가장 작은 유형입니다. (컴파일러의 불완전 함이있을 수 있음) – Skeen