1

当我使用 INT_MAX 和 INT_MIN 常量时,我​​得到 -2147483648 ... 2147483647。

但是当我尝试使用此函数计算整数的最大值和最小值时:

static int computeInt(void)
{
    int myInt = 0;
    int min = 0;
    int max = 32;

    for (int i = min; i < max; i++)
    {
        myInt = myInt + pow(2, i);
    }

    myInt = myInt / 2;

    return myInt;
}

我没有得到相同的号码。我认为发生的技术是 myInt 溢出。

谢谢!

4

4 回答 4

5

是的,您有一个溢出,因为 int 的范围是从 -2^31 到 2^31 - 1 并且您尝试计算 2 从 0 到 31 的幂的总和。您的最终值是以下结果:(2^0 + 2^1 + 2^3 + ... + 2^31) / 2这显然是大于 2^31 - 1

于 2013-03-06T11:30:10.103 回答
2

你的假设是对的。你的int溢出,因为你不断地添加它。当最大 int 只是 2^31-1 或pow(2,31)-1.

使用循环你可以这样做:

for (int i = min; i < max; i++) {
    myInt = myInt * 2;
}
myInt = myInt - 1;

(请注意,此循环也会导致临时溢出。在最后一次迭代之后myInt将是-2147483648,但减去一个将导致2147483647

于 2013-03-06T11:26:35.327 回答
2

以这种方式通过算术可靠地检测最大有符号整数是不可能的,因为一旦整数超过INT_MAX结果是未定义的(它可能会简单地崩溃)。

但是,您可以计算出最大的无符号整数,因为它保证回绕回 0,即UINT_MAX + 1保证为0. 同样,unsigned int a = -1将等于UINT_MAX

由于已签名intunsigned int保证使用相同数量的存储和对齐方式,因此您可以将计算结果UINT_MAX除以 2 得到INT_MAX. 所以:

unsigned int maxint = -1;
maxint /= 2;
于 2013-03-06T12:17:52.373 回答
1

如前面的答案和评论所述,您有溢出(即使假设sizeof(int) = 4. 如果您想“手动”计算这些常量,您可以简单地执行以下操作:

int myInt = (((unsigned int)(-1)) >> 1);
int myIntMin = -myInt - 1;

这并不是真正独立于体系结构的,因为它假定有符号整数使用 2 的补码逻辑表示,并且整数表示中没有填充位。但在许多情况下,这应该可以正常工作(在 x86 pc 上测试)。

于 2013-03-06T11:42:38.137 回答