"警告:表达式中的整数溢出"

时间:2013-11-08 06:43:40

标签: c++

我正试图利用bool矢量将存储浓缩到一个位的事实。以下配方应该是一个确定int数组是否包含重复的好方法(或者是它?我的整个想法本身存在缺陷吗?)。我无法弄清楚为什么我的编译器XCode不喜欢

INT_MAX - INT_MIN + 1

以下代码行。我尝试将表达式转换为很长时间,但我得到了相同的警告。非常感谢任何帮助!

bool contains_repeats_3(const std::vector<int>& V) { 
    std::vector<bool> bv (INT_MAX - INT_MIN + 1, 0); // <------ That's the problem line
    for (std::vector<int>::const_iterator it = V.begin() ; it != V.end(); ++it) {
        if (bv[*it - INT_MIN] == 1) {
            return true;
        } else { 
            bv[*it - INT_MIN] == 1;
        }
    }
   return false;    
}

2 个答案:

答案 0 :(得分:3)

首先,它不是你必须施放的表达,而是(long) INT_MAX - (long) INT_MIN + 1中的各个操作数。仅仅铸造第一个已经足够了。

其次,long的范围很可能与您平台上int的范围相同,这意味着转换为long不会阻止溢出。假设您可以使用,则可能必须转换为long long

第三,你确定你需要这么大的矢量吗?我希望std::vector<bool>在您的平台上实现为位向量。或者至少你的平台是64位的。在32位平台上,您正在推动阵列大小的限制。请注意std::vector并不能保证这种容量。你可能希望你的向量bv.max_size()看看它是否能够容纳那么多元素。

答案 1 :(得分:2)

从根本上说,你的问题是INT_MAX是正数而INT_MIN是负数,所以当你从MAX中减去MIN时,你实际上是在添加。

10 - -2 = 10 + 2 = 12

然后因素,您添加的数字已经是int可以存储的最大数字,而您添加的数字是最大可能的负值。 INT_MAX和0之间的差异是INT_MAX,因此INT_MAX和任何&lt; 0之间的差异大于INT_MAX。

(INT_MAX + 1) > INT_MAX
(INT_MAX - -1) > INT_MAX

基本上INT_MAX +任何&gt; 0需要比int中更多的位来描述。这是溢出,说“携带一个”的编程方式(它只有一位来注释进位,所以它可能不止一个)

想象一下,您有2位来描述有符号数,四种可能的位组合:b00(0),b01(+1),b10(-2),b11(-1)。

我们将-1分配给b11,因为b11 - b01 = b10和b00 - b01 = b11 +符号

因此:

TINYINT_MAX = 1  (b01)
TINYINT_MIN = -2 (b10)

以下是您的公式如何运作:

(TINYINT_MAX - TINYINT_MIN +  1 )
 b01           b10           b01
( 1 - -2  +  1 )
 b01  b10   b01

( 1  +  2  +  1 ) <-- things go pear shaped here.
 b01   xxx   b01

( 3  +  1 )
 xxx   b01

= 4

如果我们去无符号,我们可以处理“3”,但是4(b100)需要比我们更多的位。

但是我们的数字系统只支持+1,0,-1,-2,所以当我们说“-TINYINT_MIN”时我们就被打破了。