是否有任何代码可以在C / C ++中找到整数的最大值(相应于编译器),如java中的Integer.MaxValue
函数?
答案 0 :(得分:294)
在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;
答案 1 :(得分:25)
我知道这是一个老问题,但也许有人可以使用这个解决方案:
int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)
到目前为止,我们有-1作为结果&#39;直到 size 是一个签名的int。
size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.
正如标准所说,如果变量有符号且为负,则移入的位为1;如果变量为无符号或有符号且为正,则移位为0。
由于 size 是有符号且为负的,我们会将符号位移位1,这没有多大帮助,所以我们转换为unsigned int,强制转换为0而不是设置符号位让所有其他位保持为1时为0。
cout << size << endl; // Prints out size which is now set to maximum positive value.
我们也可以使用掩码和xor但是我们必须知道变量的确切位数。随着位前移,我们不必随时知道int在机器或编译器上有多少位,也不需要包含额外的库。
答案 2 :(得分:15)
#include <climits>
#include <iostream>
using namespace std;
int main() {
cout << INT_MAX << endl;
}
答案 3 :(得分:2)
为什么不写一段代码,如:
int max_neg = ~(1 << 31);
int all_ones = -1;
int max_pos = all_ones & max_neg;
答案 4 :(得分:2)
这是一个用于获取有符号整数的最大值的宏,它与使用的有符号整数类型的大小无关,并且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);
答案 5 :(得分:1)
O.K。我既没有回复评论以前的答案(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;
与使用这个或那个标题不同,这里我们使用编译器中的实数类型。
答案 6 :(得分:0)
对于 int 的特定最大值,我通常会写十六进制表示法:
int my_max_int = 0x7fffffff;
而不是不规则的十进制值:
int my_max_int = 2147483647;
答案 7 :(得分:0)
(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))
有效。
答案 8 :(得分:0)
#include <iostrema>
int main(){
int32_t maxSigned = -1U >> 1;
cout << maxSigned << '\n';
return 0;
}
它可能取决于体系结构,但至少在我的设置中有效。