int的最大值

d3v*_*pro 167 c c++ limits stl numeric-limits

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

Gre*_*osz 308

在C++中:

#include <limits>
Run Code Online (Sandbox Code Playgroud)

然后用

int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();
Run Code Online (Sandbox Code Playgroud)

std::numeric_limits 是一个模板类型,可以用其他类型实例化:

float fmin = std::numeric_limits<float>::min(); // minimum positive value
float fmax = std::numeric_limits<float>::max();
Run Code Online (Sandbox Code Playgroud)

在C:

#include <limits.h>
Run Code Online (Sandbox Code Playgroud)

然后用

int imin = INT_MIN; // minimum value
int imax = INT_MAX;
Run Code Online (Sandbox Code Playgroud)

要么

#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;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,浮点数"min"是最小*正*值,其中整数"min"是最小值.C宏/常量也是如此. (13认同)
  • 在C99中,您还可以使用UINT64_MAX和INT64_MAX (4认同)
  • @DmitryVyal:是的,你可以,但这些是`uint64_t`和`int64_t`的限制,而不是`int`. (3认同)
  • 一种奇特的方式就像这样 `(unsigned)-1/2` (2认同)

小智 27

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

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

到目前为止,我们的结果为-1,直到size为signed int.

size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.
Run Code Online (Sandbox Code Playgroud)

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

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

cout << size << endl; // Prints out size which is now set to maximum positive value.
Run Code Online (Sandbox Code Playgroud)

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


小智 15

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

int main() {
  cout << INT_MAX << endl;
}
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,msvc上的numeric_limits <int> :: max实现如下所示:return(INT_MAX); (17认同)
  • @paul请参考弃用.猜猜numeric_limits如何实现max()?这是正确的,"返回INT_MAX",至少在GCC 4.4.0上. (13认同)
  • 我认为两者都是C++的答案.`numeric_limits <int> :: max()` - 也适用于模板上下文,但是(由于某些不可理喻的原因)不能用作编译时常量.`INT_MAX` - 是一个宏,在模板函数中很无用,但可以用作编译时常量. (6认同)
  • 我不会将 INT_MAX 称为“C 的解决方案”。不过,它是过时的,在 C++ 中已弃用。 (2认同)
  • @UncleBens:内联函数目前无法简化为常量表达式. (2认同)