是否有任何代码可以在C / C ++中找到类似Integer.MaxValue
Java中函数的整数最大值(根据编译器)?
int
用long long int
Gregory的答案代替...
-pedantic
)支持它。
是否有任何代码可以在C / C ++中找到类似Integer.MaxValue
Java中函数的整数最大值(根据编译器)?
int
用long long int
Gregory的答案代替...
-pedantic
)支持它。
Answers:
在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;
min
是最小的正值,其中整数min
是最小值。C宏/常量也是如此。
uint64_t
and 的限制,而int64_t
不是of 的限制int
。
我知道这是一个老问题,但也许有人可以使用以下解决方案:
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在机器或编译器上有多少位,也不需要我们包括额外的库。
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
#include <climits>
#include <iostream>
using namespace std;
int main() {
cout << INT_MAX << endl;
}
numeric_limits<int>::max()
-也可以在模板上下文中使用,但是(出于某些不可思议的原因)不能用作编译时常量。INT_MAX
-是一个宏,在模板函数中几乎没有用,但可以用作编译时常量。
为什么不写如下代码:
int max_neg = ~(1 << 31);
int all_ones = -1;
int max_pos = all_ones & max_neg;
好吧,我既没有回复对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头不同,这里我们使用编译器中的实型。
那呢(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))
可以使用。