int의 최대 값


177

Integer.MaxValuejava의 함수 와 같은 C / C ++에서 정수의 최대 값 (컴파일러에 따라)을 찾는 코드가 있습니까?


1
long long int의 최대 값을 찾는 방법이 있습니까 ??
d3vdpro 2009

그냥 교체 int와 함께 long long int... Gregories의 대답
게오르그 FRITZSCHE에게

1
long long은 C ++의 일부가 아닙니다.


@Neil은 C99이지만 VC와 GCC는 (없이 -pedantic) 지원합니다.
Georg Fritzsche

답변:


323

C ++에서 :

#include <limits>

그런 다음 사용

int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();

std::numeric_limits 다른 유형으로 인스턴스화 할 수있는 템플릿 유형입니다.

float fmin = std::numeric_limits<float>::min(); // minimum positive value
float fmax = std::numeric_limits<float>::max();

C에서 :

#include <limits.h>

그런 다음 사용

int imin = INT_MIN; // minimum value
int imax = INT_MAX;

또는

#include <float.h>

float fmin = FLT_MIN;  // minimum positive value
double dmin = DBL_MIN; // minimum positive value

float fmax = FLT_MAX;
double dmax = DBL_MAX;

13
부동 소수점 min은 최소 양수 값이며 정수 min는 최소값입니다. C 매크로 / 상수도 마찬가지입니다.
dalle

4
C99에서 당신은 또한 UINT64_MAX 및 INT64_MAX 사용할 수 있습니다
드미트리 Vyal

3
@DmitryVyal : 예. 가능하지만의 한계는 uint64_t및 의 한계가 int64_t아닙니다 int.
Keith Thompson

C ++에서 나는 위에 표시된 동일한 코드를 사용 : #include <limits>int imax = std::numeric_limits<int>::max();,하지만 오류를 얻을 Can't resolve struct member 'max'. 왜 이런 일이 발생하고 어떻게 해결해야하는지에 대한 아이디어가 있습니까? Ubuntu 14.04에서 CMake 및 C ++ 11과 함께 CLion IDE를 사용하고 있습니다. 이 문제
modulitos

1
내가 최신 CLion 사용하여 고정하는 CLion IDE 버그 때문에 희망이 사람을 도움 (빌드 138.2344을 - CLion는 초기 액세스 프로그램 단계에 있으며, 따라서 불안정)
modulitos

30

나는 그것이 오래된 질문이라는 것을 알고 있지만 누군가이 솔루션을 사용할 수 있습니다.

int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)

지금까지 크기 가 부호있는 정수가 될 때까지 결과는 -1 입니다.

size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.

Standard가 말했듯이, 변수에 부호가 있으면 시프트 된 비트는 1이고, 부호가 없거나 부호가 있고 양수이면 변수는 0입니다.

으로 크기가 서명하고 우리가 서명되지 않은 INT 캐스팅 있도록시키는 동안 부정적인 우리가 0에 부호 비트를 설정하는 대신 0으로 이동하는 강제 많은 도움이되지 않는 일이며, 부호 비트에 이동하는 모든 다른 비트는 1 남아있다.

cout << size << endl; // Prints out size which is now set to maximum positive value.

마스크와 xor를 사용할 수도 있지만 변수의 정확한 비트 크기를 알아야했습니다. 비트를 앞뒤로 이동하면 기계 또는 컴파일러에 int가 몇 비트인지 알 필요가 없으며 추가 라이브러리를 포함해야합니다.


1
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
Slaiyer

15
#include <climits>
#include <iostream>
using namespace std;

int main() {
  cout << INT_MAX << endl;
}

1
나는 INT_MAX를 "C를위한 솔루션"이라고 부르지 않을 것이다. 그래도 구식이며 C ++에서는 더 이상 사용되지 않습니다.
Paul Tomblin

6
둘 다 C ++ 답변이라고 생각합니다. numeric_limits<int>::max()-템플릿 컨텍스트에서도 작동하지만 (나에게 확실한 이유로) 컴파일 타임 상수로 사용할 수 없습니다. INT_MAX-매크로는 템플릿 함수 내에서 쓸모가 없지만 컴파일 타임 상수로 사용할 수 있습니다.
UncleBens 2009

17
재미있는 점은 msvc의 numeric_limits <int> :: max 구현은 다음과 같습니다. return (INT_MAX);
Nikola Smiljanić

13
@paul 지원 중단 참조. 그리고 numeric_limits가 max ()를 어떻게 구현하는지 생각해보십시오. 맞습니다. 적어도 GCC 4.4.0에서는 "INT_MAX를 반환하십시오."

2
@UncleBens : 현재 인라인 함수를 상수 표현식으로 줄일 수 없습니다.
Georg Fritzsche

1

다음은 사용되는 부호있는 정수 유형의 크기와 무관하고 gcc -Woverflow가 불평하지 않는 부호있는 정수의 최대 값을 얻는 데 사용하는 매크로입니다

#define SIGNED_MAX(x) (~(-1 << (sizeof(x) * 8 - 1)))

int a = SIGNED_MAX(a);
long b = SIGNED_MAX(b);
char c = SIGNED_MAX(c); /* if char is signed for this target */
short d = SIGNED_MAX(d);
long long e = SIGNED_MAX(e);

1

왜 다음과 같은 코드를 작성하지 않습니까?

int  max_neg = ~(1 << 31);
int  all_ones = -1;
int max_pos = all_ones & max_neg;

28
int의 크기가 32 비트라는 보장은 없으며 메모리의 음의 정수 형식에 대한 보장은 없습니다. 덜 중요한 것은 사람들이 '~'를 찾도록 만들 필요가 없다는 것입니다.
Sqeaky

0

OK (Philippe De Muyter의) 이전 답변에 대해 언급하거나 점수 를 올리지 않았으므로 부호없는 유형에 대해 SIGNED_MAX에 대한 그의 define 을 사용하는 새로운 예제가 있습니다.

// We can use it to define limits based on actual compiler built-in types also: 
#define INT_MAX   SIGNED_MAX(int)
// based on the above, we can extend it for unsigned types also:
#define UNSIGNED_MAX(x) (  (SIGNED_MAX(x)<<1) | 1 ) // We reuse SIGNED_MAX
#define UINT_MAX  UNSIGNED_MAX(unsigned int) // on ARM: 4294967295
// then we can have:
unsigned int width = UINT_MAX;

이 헤더 나 그 헤더를 사용하는 것과 달리 여기서는 컴파일러의 실제 유형을 사용합니다.


0
#include <iostrema>

int main(){
    int32_t maxSigned = -1U >> 1;
    cout << maxSigned << '\n';
    return 0;
}

아키텍처에 따라 다를 수 있지만 적어도 내 설정에서는 작동합니다.


-1

int 의 특정 최대 값에 대해 일반적으로 16 진수 표기법을 작성합니다.

int my_max_int = 0x7fffffff;

불규칙한 십진수 값 대신 :

int my_max_int = 2147483647;

-1

무엇에 대해 (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2)). 이것은와 동일합니다 2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2).

만약 sizeof(int) = 4 => 2^(8*4-2) - 1 + 2^(8*4-2) = 2^30 - 1 + 20^30 = (2^32)/2 - 1 [max signed int of 4 bytes].

2*(1 << (8*sizeof(int)-2)) - 1오버플로되기 때문에 사용할 수는 없지만 (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.