C++ &引用;警告:表达式“中存在整数溢出”;

C++ &引用;警告:表达式“中存在整数溢出”;,c++,C++,我试图利用布尔向量将存储压缩为单个位的事实。下面的方法应该是一个确定int数组是否包含重复的好方法(或者它是吗?我的整个想法是否有内在缺陷?)。我不明白为什么我的编译器XCode不喜欢 INT_MAX - INT_MIN + 1 下面代码的第行。我试着把这个表情拉长,但我得到了同样的警告。非常感谢您的帮助 bool contains_repeats_3(const std::vector<int>& V) { std::vector<bool> bv

我试图利用布尔向量将存储压缩为单个位的事实。下面的方法应该是一个确定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;    
}
bool包含重复3(const std::vector&V){

std::vector bv(INT_MAX-INT_MIN+1,0);//首先,它不是必须强制转换的表达式,而是单个操作数,如
(long)INT_MAX-(long)INT_MIN+1
中所述。仅强制转换第一个操作数已经足够了

其次,
long
的范围很可能与平台上的
int
的范围相同,这意味着转换到
long
将无法防止溢出。如果您可以使用,您可能必须转换到
long


第三,您确定需要这样大小的向量吗?我希望
std::vector
在您的平台上实现为位向量。或者至少您的平台是64位的。在32位平台上,您正在突破数组大小的限制。请注意
std::vector
并不能保证您具有这种容量。您可能希望查看向量的
bv.max_size()
,看看它是否能够容纳那么多元素。

首先,您不必强制转换表达式,而是单个操作数,如
(long)INT_max-(long)INT_MIN+1
中所述。仅强制转换第一个操作数已经足够了

其次,
long
的范围很可能与平台上的
int
的范围相同,这意味着转换到
long
将无法防止溢出。如果您可以使用,您可能必须转换到
long


第三,您确定需要这样大小的向量吗?我希望
std::vector
在您的平台上实现为位向量。或者至少您的平台是64位的。在32位平台上,您正在突破数组大小的限制。请注意
std::vector
并不能保证您具有这种容量。您可能希望查看向量的
bv.max\u size()
,看看它是否能够容纳那么多元素。

基本上,你的问题是INT\u max是正的,INT\u MIN是负的,所以当你从max中减去MIN时,实际上是在加

10 - -2 = 10 + 2 = 12
然后,您要添加的数字已经是int可以存储的最大数字,而您要添加的数字是可能的最大负值。int_MAX和0之间的差异是int_MAX,因此int_MAX和anything0之间的差异需要比int中更多的位来描述。这是溢出,编程表示“进位1”的y(它只有一个位来注释进位,所以它可能不止一个)

假设您有两个位来描述一个有符号的数字,四种可能的位组合: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
(TINYINT_最大值-TINYINT_最小值+1)
b01 b10 b01
( 1 - -2  +  1 )
b01 b10 b01

(1+2+1)基本上,你的问题是INT_MAX是正的,INT_MIN是负的,所以当你从MAX中减去MIN时,实际上是在加

10 - -2 = 10 + 2 = 12
然后,您要添加的数字已经是int可以存储的最大数字,而您要添加的数字是可能的最大负值。int_MAX和0之间的差异是int_MAX,因此int_MAX和anything0之间的差异需要比int中更多的位来描述。这是溢出,编程表示“进位1”的y(它只有一个位来注释进位,所以它可能不止一个)

假设您有两个位来描述一个有符号的数字,四种可能的位组合: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
(TINYINT_最大值-TINYINT_最小值+1)
b01 b10 b01
( 1 - -2  +  1 )
b01 b10 b01

( 1 + 2 + 1 )理论上,你想用代码实现什么?InthMax?InthMIN +1?<代码>?理论上不是总是代码< 0 >代码>为什么:理论上它是<代码> 0?/代码>是不是IntAmin Min?,所以InthMax -IntMIN + 1=2×InthMax +1?@ M0NK3Y:是的,<代码> In Min < /Calp>是否定的。那么你知道C++中的代码< ST::向量< /代码>已经是SPECI了吗?你想用
INT\u MAX-INT\u MIN+1
实现什么?理论上它不是总是
0
吗?@Drop:为什么理论上它是
0
呢?INT\u MIN不是负的,所以INT\u MAX-INT\u MIN+1=2*INT\u MAX+1?@m0nk3y:是的,
INT\u MIN
是负的。那么你知道吗C++中的Ctoor <代码>已经专门用于每个项目只使用一个比特?