gcc"溢出表达"而等效的等效表达式工作正常

时间:2016-05-19 08:26:21

标签: c++ c++11 gcc

这是我的代码

#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)

1 个答案:

答案 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,因此没有溢出。