Integer.MaxValue
java의 함수 와 같은 C / C ++에서 정수의 최대 값 (컴파일러에 따라)을 찾는 코드가 있습니까?
int
와 함께 long long int
... Gregories의 대답
-pedantic
) 지원합니다.
Integer.MaxValue
java의 함수 와 같은 C / C ++에서 정수의 최대 값 (컴파일러에 따라)을 찾는 코드가 있습니까?
int
와 함께 long long int
... Gregories의 대답
-pedantic
) 지원합니다.
답변:
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;
min
은 최소 양수 값이며 정수 min
는 최소값입니다. C 매크로 / 상수도 마찬가지입니다.
uint64_t
및 의 한계가 int64_t
아닙니다 int
.
나는 그것이 오래된 질문이라는 것을 알고 있지만 누군가이 솔루션을 사용할 수 있습니다.
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가 몇 비트인지 알 필요가 없으며 추가 라이브러리를 포함해야합니다.
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
#include <climits>
#include <iostream>
using namespace std;
int main() {
cout << INT_MAX << endl;
}
numeric_limits<int>::max()
-템플릿 컨텍스트에서도 작동하지만 (나에게 확실한 이유로) 컴파일 타임 상수로 사용할 수 없습니다. INT_MAX
-매크로는 템플릿 함수 내에서 쓸모가 없지만 컴파일 타임 상수로 사용할 수 있습니다.
다음은 사용되는 부호있는 정수 유형의 크기와 무관하고 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);
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;
이 헤더 나 그 헤더를 사용하는 것과 달리 여기서는 컴파일러의 실제 유형을 사용합니다.
무엇에 대해 (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))
작동합니다.