int의 최대 값 C / C ++에서 정수의

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



답변

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;

답변

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

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가 몇 비트인지 알 필요가 없으며 추가 라이브러리를 포함해야합니다.


답변

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

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

답변

다음은 사용되는 부호있는 정수 유형의 크기와 무관하고 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);

답변

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

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

답변

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;

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


답변

#include <iostrema>

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

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