2010-08-12 8 views
64

내 프로그램이 실행중인 시스템에서 size_t의 최대 값을 알고 싶습니다. 나의 첫번째 본능과 같이, 한 음을 사용하는 것이었다 :size_t의 최대 값을 찾는 휴대용 방법은 무엇입니까?

size_t max_size = (size_t)-1; 

하지만 더 좋은 방법, 또는 어딘가에 정의 된 상수가있다 같은데요.

+1

그건 아주 현명한 속임수입니다. +1! – Mhmmd

+0

네, 가지고있는 것은 괜찮습니다 (캐스팅은 필요 없습니다). –

+0

호기심에서 왜이 사실을 알고 싶습니까? –

답변

64

C99에 매니페스트 상수 (매크로)가 있으며 SIZE_MAX이라고합니다. C89/90에는 그런 상수가 없습니다.

그러나 원래 게시물에있는 내용은 최대 값이 size_t 인 완벽한 휴대 방법입니다. 서명되지 않은 유형으로 작업 할 수 있습니다.

+0

감사합니다. 제 컴파일러에 캐스트가 필요하거나 정수 변환 중 부호 변경에 대한 경고가 발행됩니다. – Justicle

+0

완벽하게 이식성이 사실입니까? 그것이 함정 표현이되는 것을 막는 것은 무엇입니까? – jamesdlin

+8

@jamesdlin : 부호가있는 부호없는 변환은 항상 C에서 잘 정의되어 있습니다. 부호없는 대상의 최대 값에 1을 더한 모듈로를 사용하는 일반적인 부호없는 모듈러스 산술 규칙을 따라야합니다. 위의 경우'-1 mod ( +1)'이 표시되며 항상 ''입니다. – AnT

12
#define MAZ_SZ (~(size_t)0) 

또는 SIZE_MAX

3

영업 제안한 size_t max_size = (size_t)-1; 솔루션은 확실히 지금까지 최고입니다,하지만 난이 일을하는 또 다른, 더 복잡한, 방법을 알아낼했다. 학문적 호기심으로 게시하고 있습니다.

#include <limits.h> 

size_t max_size = ((((size_t)1 << (CHAR_BIT * sizeof(size_t) - 1)) - 1) << 1) + 1; 
+12

일부 코드 (특히 주석이없는 코드)에서이 코드를 찾으면 매우 심술 궂을 수 있습니다. :) –

4

비트 연산에 대한 대안은 다른 답변에서 제안한 것처럼, 당신이 할 수있는 C++

#include <limits> 
size_t maxvalue = std::numeric_limits<size_t>::max() 
+1

'std :: numeric_limits :: max()'는 constexpr이 아니며 Clang과 같은 일부 컴파일러에서는 제대로 최적화되지 않았습니다. GCC, ICC 및 MSC는 잘 처리합니다. '#define '을 사용하는 것이 더 좋습니다. – jww

+1

@jww 사용할 수있는'max()'의'constexpr' 버전이 있어야합니다 : http://en.cppreference.com/w/cpp/types/numeric_limits/max –

관련 문제