是否有任何代码可以在C/ c++中找到整数的最大值(根据编译器),如integer。java中的MaxValue函数?


当前回答

好吧,我没有代表评论之前的答案(Philippe De Muyter),也没有提高它的分数,因此有一个新的例子,使用他对SIGNED_MAX的定义,简单地扩展为unsigned类型:

// 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 <climits>
#include <iostream>
using namespace std;

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

好吧,我没有代表评论之前的答案(Philippe De Muyter),也没有提高它的分数,因此有一个新的例子,使用他对SIGNED_MAX的定义,简单地扩展为unsigned类型:

// 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[最大signed int of 4字节]。

你不能使用2*(1 << (8*sizeof(int)-2)) - 1,因为它会溢出,但是(1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))可以。

为什么不写一段这样的代码:

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

下面是一个宏,用于获取有符号整数的最大值,它与所使用的有符号整数类型的大小无关,并且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);