这是我的代码
#include <iostream>
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36);
static const unsigned long long int y = 36 * 36 * 36 * 36;
static const unsigned long long int yy = y * y;
int main()
{
std::cout << xx << std::endl;
std::cout << yy << std::endl;
return 0;
}
这是编译输出
# g++ -std=c++11 test.cpp -o test
test.cpp:2:62: warning: integer overflow in expression [-Woverflow]
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36);
这是执行输出
# ./test
18446744073025945600
2821109907456
你能解释为什么我会看到这个警告和不同的结果?如果36可以适合char,那么36 ^ 8可以适合unsigned long long int,所以我不确定这里有什么问题,请指教。 (我使用的是gcc 4.9.2)
答案 0 :(得分:10)
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36);
36
的类型为int
∴36 * 36
的类型为int
∴(36 * 36 * 36 * 36)
的类型为int
∴(36 * 36 * 36 * 36) * (36 * 36 * 36 * 36)
具有类型int
并且溢出,这实际上是签名类型的未定义行为。
你可能想要
static const unsigned long long int xx = (36ull * 36 * 36 * 36) * (36 * 36 * 36 * 36);
至于第二种情况:
static const unsigned long long int yy = y * y;
y
的类型为unsigned long long
∴y * y
的类型为unsigned long long
,因此没有溢出。