int的最大值


176

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


1
有什么方法可以找到long long int的最大值吗?
d3vdpro

只需intlong long intGregory的答案代替...
Georg Fritzsche

1
不同之处在于长长不是C ++部分


@Neil,对,它的C99-但是VC和GCC(不带-pedantic)支持它。
乔治·弗里茨彻

Answers:


322

在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
Dmitry Vyal 2013年

3
@DmitryVyal:是的,可以,但是这些是uint64_tand 的限制,而int64_t不是of 的限制int
基思·汤普森

在C ++中,我使用了上面显示的相同代码:#include <limits>int imax = std::numeric_limits<int>::max();,但是出现了error Can't resolve struct member 'max'。关于这种情况为什么发生以及如何解决的任何想法?我在Ubuntu 14.04上使用带有CMake和C ++ 11的CLion IDE。我认为这与这个问题有关
修改

1
希望这可以帮助别人,因为它是一个克利翁IDE错误,我固定使用最新的克利翁(编译138.2344 -克利翁是在早期使用计划阶段,因此,不稳定的)
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。

大小为有符号负数时,我们会将符号位1移入,这没有多大帮助,因此我们将其强制转换为unsigned int,强制将其移入0,将符号位设置为0,同时让所有其他位保持为1。

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

我们也可以使用mask和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

17
有趣的是,msvc上的numeric_limits <int> :: max实现看起来像这样:return(INT_MAX);
NikolaSmiljanić09年

13
请使用@paul参考。并猜想numeric_limits如何实现max()?是的,至少在GCC 4.4.0上是“返回INT_MAX”。

2
@UncleBens:当前无法将内联函数简化为常量表达式。
乔治·弗里茨彻

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 2012年

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头不同,这里我们使用编译器中的实型。


0
#include <iostrema>

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

它可能依赖于体系结构,但是至少在我的设置中有效。


-1

对于int的特定最大值,我通常用十六进制表示法:

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))可以使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.