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).
从C标准(1999):
6.3.1.4实浮动和整数
1当实数浮动类型的有限值转换为除_Bool以外的整数类型时,小数部分被丢弃(即,该值被截断为零).如果整数部分的值不能用整数类型表示,则行为是未定义的.
从C++标准(2003):
4.9浮动积分转换[conv.fpint]
1浮点类型的rvalue可以转换为整数类型的rvalue.转换截断; 也就是说,丢弃小数部分.如果截断的值无法在目标类型中表示,则行为未定义.[注意:如果目的地类型是bool,请参阅4.12.]
很可能你的double太大而无法正确转换为int.
将a double转换为intwhen int不足以保持该值会产生未定义的行为.
[n3290: 4.9/1]:可以将浮点类型的prvalue转换为整数类型的prvalue.转换截断; 也就是说,丢弃小数部分.如果截断的值无法在目标类型中表示,则行为未定义.
此行为源自C:
[C99: 6.3.1.4/1]:当实数浮动类型的有限值被转换为除了以外的整数类型时_Bool,小数部分被丢弃(即,该值被截断为零).如果整数部分的值不能用整数类型表示,则行为是未定义的.
对你来说,int显然还不够大.
但不依赖于任何(或实际上,任何)在此代码的行为.
| 归档时间: |
|
| 查看次数: |
1099 次 |
| 最近记录: |