静态从大型double转换为整数时的奇怪行为

时间:2011-10-09 12:43:08

标签: c++ casting g++ int double

这是我的简单代码:

int main() {
  double d1 = 10000000000.0;
  const double d2 = 10000000000.0;

  cout << static_cast<int>(d1) << endl;
  cout << static_cast<int>(d2) << endl;
  cout << static_cast<int>(10000000000.0) << endl;
}

输出结果为:

-2147483648
2147483647
2147483647

这令我感到惊讶。为什么一个正面的双重有时会被转换为负数?

我正在使用g++:GCC版本4.4.3(Ubuntu 4.4.3-4ubuntu5)。

2 个答案:

答案 0 :(得分:5)

从C标准(1999):
6.3.1.4实际浮动和整数
1当实数浮动类型的有限值转换为_Bool以外的整数类型时, 丢弃小数部分(即,该值被截断为零)。如果值 整数部分不能用整数类型表示,行为是未定义的。

从C ++标准(2003):
4.9浮动积分转换[conv.fpint]
1浮点类型的右值可以转换为整数类型的右值。转换截断; 也就是说,丢弃小数部分。如果截断值不能,则行为未定义 以目的地类型表示。 [注意:如果目的地类型是bool,请参阅4.12。 ]

很可能你的双倍太大而无法正确转换为int。

答案 1 :(得分:5)

double不足以保持值时,int投放到int会产生未定义的行为

  

[n3290: 4.9/1]:可以转换浮点类型的prvalue   到整数类型的prvalue。转换截断;那是,   小数部分被丢弃。 如果是,则行为未定义   截断值无法在目标类型中表示。

此行为源自C:

  

[C99: 6.3.1.4/1]:当实际浮动类型的有限值为   转换为除_Bool以外的整数类型,小数部分为   丢弃(即,该值被截断为零)。 如果值   整数部分不能用整数类型表示   行为未定义。

对你而言,int显然还不够大。

  • 而且,在第一种情况下,对你来说,这恰好会导致符号位被设置。
  • 在第二和第三种情况下,再次对你而言,可能会发生导致不同行为的优化。

但是,不要依赖此代码中的 (或者,实际上任何)行为。