2016-10-05 5 views
2

<limits>과 같은 헤더를 포함하지 않고 부호없는 정수 타입의 최대 값을 얻으려고합니다. 그래서 저는 부호없는 정수 값 0의 비트를 뒤집기 만하면된다고 생각했습니다.비트 값이 0이 아닌 값으로 부호없는 최대 값 얻기

#include <iostream> 
#include <limits> 

int main() 
{ 
    std::cout << (~0U) << '\n'; // #1 
    std::cout << (std::numeric_limits<unsigned>::max()) << '\n'; // #2 
    return 0; 
} 

저는 이들 사이의 미묘한 차이에 대해서는 경험이 없습니다. 그래서 첫 번째 방법을 사용하여 예기치 않은 동작 또는 일부 플랫폼/아키텍처 문제가 발생할 수 있는지 묻는 것입니다.

+3

'~ 0U'은 괜찮습니다. –

+1

표준은 2의 보수 표현을 보장하지 않으므로,이 트릭은 이식성이 없으며 엄밀히 말하면됩니다. 실제로는 항상 작동 할 것입니다 만, 'unsigned int'인 '0U'로 지정하는 대신 '0'을 예상되는 형식으로 변환하는 것이 좋습니다. 예를 들어'unsigned long long b = ~ 0U;'int는'long long'보다 적은 비트를 사용할 때'unsigned long long' 값을 잘못 지정합니다. –

+0

@ChristopherOicles 제안에 감사드립니다. 실제로'~ static_cast (0)'을 적당한 크기의 타입에 사용하고 있습니다. –

답변

4

...

단순히 값에게 인 -1-1

unsigned_type_of_choice max = -1; 

변환 할당 모든 헤더를 포함하지 않고 소정의 부호없는 정수 형태의 최대 값을 구하는 int의 경우 부호가없는 유형의 값이에서 1을 뺀 값이 인 값이됩니다.

다음은 대상 유형의 최대 값을 제공하지 않습니다. 대상 유형 범위가 ~0U 유형인 unsigned의 범위를 초과하면 실패합니다. @Christopher Oicles

// problem 
unsigned_type_of_choice max_wannabe = ~0U; 
+0

이 (정의 된) 동작에 대한 설명서는 [here] (http://stackoverflow.com/a/2711560/2436175)에서 인용합니다. [Here] (http://en.cppreference.com/w/cpp/language/implicit_conversion)은 훨씬 명확합니다. – Antonio

+0

그 문서는 C++입니다. 내 목표는 C/C++ 솔루션이었습니다. – chux

+0

예! 슈퍼 부지런히 지내려면 두 표준 모두에서 해당 섹션을 찾으십시오.하지만 너무 많은 노력이 필요합니다. 어쨌든, C에 대해서는 [here] (http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe)를 참조 할 수 있습니다. 나는 그다지 깊지는 않았지만 동일한 결과를 이끌어 내더라도 C와 C++에 대해 설명 된 메커니즘이 다릅니다. – Antonio

3

당신은 ~0U 단지 서명되지 않은 유형을 지정해서는 안 chux's answer 이미 이유를 설명합니다.

C++의 경우 다음과 같이 모든 부호없는 유형에 대해 가능한 최대 값을 얻을 수 있습니다.

template <typename T> 
T max_for_unsigned_type() { 
    return ~(static_cast<T> (0)); 
} 

당신은 당신의 정확한 유형의 0을 부정 있습니다. 서명 된 값에 사용해서는 안되기 때문에 자세한 함수 이름을 사용합니다. 문제는 signedness를 확인하는 가장 쉬운 방법은 추가 헤더, 즉 type_traits을 포함하는 것입니다. This other answer이 유용 할 것입니다.

사용법 :

max_for_unsigned_type<uint8_t>(); 
max_for_unsigned_type<uint16_t>(); 
max_for_unsigned_type<uint32_t>(); 
max_for_unsigned_type<uint64_t>(); 
max_for_unsigned_type<unsigned>(); 

값은 반환이 :

255 
65535 
4294967295 
18446744073709551615 
4294967295 

주 (테스트 코드 here 참조) : 서명 유형을 수행하는 것은 훨씬 더 어렵다, Programmatically determining max value of a signed integer type를 참조하십시오.

+1

멋진 C++ 솔루션. – chux

관련 문제