这是我的简单代码:
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)。
答案 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
显然还不够大。
但是,不要依赖此代码中的 (或者,实际上任何)行为。