2013-07-08 2 views
5

알 수없는 유형의 최대 정수 값을 찾는 방법은 무엇입니까?알 수없는 정수 유형의 최대 값을 찾는 방법

template<class T> 
T test(T i) { 
    if (((T)-1) > 0) 
     return -1; 
    T max_neg = ~(1 << ((sizeof(T)*8)-1)); 
    T all_ones = -1; 
    T max_pos = all_ones & max_neg; 
    return max_pos; 
} 
+0

참고 : 주어진 코드가 잘못되었을 수 있습니다. 초기의'-1' 테스트와 unsigned 타입에 대한 반환은 OK이지만, 다음과 같이합니다 : max_neg에 대해서 : 첫번째'CHAR_BIT'는 8보다 클 수 있고, 어쨌든'1'을 _sign bit_로 옮깁니다. 나는 그것이 정의되지 않았다고 생각한다; 'all_ones '에 대해서 :'-1'은 예를 들어 1의 보수 또는 사인 및 크기계에서 "모든 것"이 될 수 없습니다. 그리고 논리에 대해서 : 그것은 'max_neg'가 이미'max_pos'와 같을 것 같습니다. –

답변

21

std::numeric_limits<T>::max()을 사용하십시오. C++ 11 이후이 함수는 constexpr이므로 컴파일시 평가됩니다.

+2

pre-C++ 11에서도 함수는 일반적으로 인라인이었으며 컴파일러는 컴파일 타임에이 함수를 평가합니다. (그러나 이것이 필요하지 않았기 때문에 컴파일 타임 상수가 필요한 컨텍스트에서 사용할 수 없었습니다.) –

5

std::numeric_limits<T>::max() 좋은 출발점이 될 것입니다 : 이이보다 더 효율적 일입니다.

0

괜찮 으면 : std::numeric_limits<T>::max() 또는 원하는 경우 부스트 : boost::integer_traits<T>::max().

+0

* "둘 모두의 선형 복잡성"* - 허, 선행 복잡성, 존재하지 않는 입력? 그들이 반환하는 단순한 상수입니다. –

+1

@ChristianRau Pre C++ 11에서는 표준이 어떤 복잡성도 부과하지 않았으므로 구현이 선형 복잡성을 만들 수 있습니다 (증분이 더 작은 값이 될 때까지 증가 시킴). 물론, 어리석은 사람은 아무도 없다고 말하는 것이 안전 할 것입니다. –

+0

@ChristianRau 네 말이 맞아. – soerium

관련 문제