2013-03-26 96 views
6

我疑惑这个代码片段:为什么在这个乘法中有一个整数溢出?

#include <climits> 
#include <iostream> 
int main(void) { 
    using namespace std; 
    cout << "long max " << LONG_MAX << endl; 
    long x = 2 * 1024 * 1024 * 1024; 
    cout << "2 * 1024 * 1024 * 1024 = " << x << endl; 
    return 0; 
} 

我期待理所应当的,而不是我得到。使用无符号似乎没有帮助。是什么赋予了?

long max 9223372036854775807 
2 * 1024 * 1024 * 1024 = -2147483648 
+0

如果你输入'1024',它已经有一个数据类型,这个语言是整数。这就是为什么如果你想要长数据类型的话你需要指定'1024L'。 – eis 2013-03-26 22:55:05

回答

11

加一些L s *。 long x = 2L * 1024L * 1024L * 1024L;

(从技术上说,只要有一个文字是long类型的人将晋升为long

溢出是因为2等是int类型的默认情况下,溢出之前发生分配。

请参阅integer literals它解释了不同的文字。

+1

而且signed int最大为'(2^31) - 1',所以'2^31'溢出了一个。 (只是为了使它更完整)。 – scones 2013-03-26 22:59:12

+0

我错误地认为upcast会照顾它,显然不是。 thx – Oliver 2013-03-26 23:00:57

+0

@Oliver:溢出发生在赋值之前。另请注意,有符号整数溢出在C++中是未定义的行为。 – 2013-03-26 23:05:41

相关问题