我正试图利用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;
}
答案 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”时我们就被打破了。