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

Kai*_*Kai 10 c++ double int casting g++

这是我的简单代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

-2147483648
2147483647
2147483647
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*nze 5

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

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

很可能你的double太大而无法正确转换为int.


Lig*_*ica 5

将a double转换为intwhen int不足以保持该值会产生未定义的行为.

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

此行为源自C:

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

对你来说,int显然还不够大.

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

但不依赖于任何(或实际上,任何)在此代码的行为.