191

是否有任何代码可以在 C/C++ 中找到整数的最大值(根据编译器),比如Integer.MaxValuejava 中的函数?

4

8 回答 8

343

在 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;
于 2009-12-06T14:00:56.640 回答
33

我知道这是一个老问题,但也许有人可以使用这个解决方案:

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

到目前为止,我们有 -1 作为结果,直到size是有符号的 int。

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

正如标准所说,如果变量是有符号且为负的,则移入的位为 1,如果变量为无符号或有符号且为正,则移入的位为 0。

由于大小是有符号的和负的,我们将移入符号位 1,这没有多大帮助,所以我们强制转换为无符号整数,强制移入 0,将符号位设置为 0,同时让所有其他位保持 1。

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

我们也可以使用掩码和异或,但我们必须知道变量的确切位大小。通过在位前移位,我们不必随时知道 int 在机器或编译器上有多少位,也不需要包含额外的库。

于 2015-04-22T10:55:43.310 回答
16
#include <climits>
#include <iostream>
using namespace std;

int main() {
  cout << INT_MAX << endl;
}
于 2009-12-06T14:01:07.420 回答
1

为什么不写一段代码,例如:

int  max_neg = ~(1 << 31);
int  all_ones = -1;
int max_pos = all_ones & max_neg;
于 2012-03-22T14:46:03.097 回答
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);
于 2016-06-13T08:40:21.840 回答
0

好的,我既没有代表评论(Philippe De Muyter 的)以前的答案,也没有提高它的分数,因此一个使用他对 SIGNED_MAX的定义的新示例对无符号类型进行了简单扩展:

// 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;

与使用 this 或 that 头文件不同,这里我们使用编译器中的真实类型。

于 2017-03-18T22:44:14.567 回答
0
#include <iostrema>

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

它可能取决于架构,但至少在我的设置中确实有效。

于 2019-04-25T06:11:28.867 回答
-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))可以使用。

于 2017-12-21T22:50:01.080 回答