从双精度转换为整数的显式类型是否始终检查整数溢出?

Does explicit type cast from double to integer always check for integer overflow?

本文关键字:整数 是否 检查 溢出 类型 转换 双精度      更新时间:2023-10-16

我用一些在线编译器做了一些测试,通过使用显式类型转换,它会自动防止溢出/下溢。

例如,从双999999999999999999到 uint32,结果是最大的 uint32 数。我的问题是该功能来自哪里?它是标准的 C/C++ 还是特定于编译器的?谢谢。

例:

double a;
a = 999999999999999999.0;
int b;
b = a;

在线编译器:codeinterview.io 离线:Visual Studio 2019社区(最新稳定版本(

从浮点数转换为整数时,

"如果无法在目标类型中表示截断的值,则行为未定义。">

https://eel.is/c++draft/conv.fpint#1

摘自 1998 年 C++ 标准,第 4.9 节第 1 段

浮点类型的右值可以转换为整数类型的右值。转换蹦蹦跳跳;也就是说,小数部分被丢弃。如果无法在目标类型中表示截断的值,则未定义此行为。

所有C++标准中都存在类似的条款。

因此,OP 完成的转换给出了未定义的行为。