C ++标准对于在目标类型范围之外的类型的转换结果的结果有何评价?

时间:2013-12-06 10:14:18

标签: c++ c++11 casting

最近,我不得不执行从float到16位整数的一些数据类型转换。基本上我的代码简化为以下

float f_val = 99999.0;
short int si_val = static_cast<short int>(f_val);

// si_val is now -32768

这个输入值是一个问题,在我的代码中,我忽略了检查浮点值的限制,所以我可以看到我的错,但是当我不得不这样做时,它让我想知道语言的确切规则愚蠢的演员。我有点惊讶地发现演员的价值是-32768。此外,只要float的值超过16位整数的限制,这就是我得到的值。我用谷歌搜索了这个,但发现了一个令人惊讶的缺乏关于它的详细信息。我能找到的最好的是cplusplus.com

中的以下内容
  

从一些较小的整数类型转换为int,或从double转换为int   浮动被称为促销,并保证产生精确   目标类型中的值相同。其他转换之间   算术类型可能无法始终表示相同的值   恰好:

If the conversion is from a floating-point type to an integer type, the value 
is truncated (the decimal part is removed).
The conversions from/to bool consider false equivalent to zero (for numeric 
types) and to null pointer (for pointer types); and true equivalent to all 
other values.
Otherwise, when the destination type cannot represent the value, the conversion 
is valid between numerical types, but the value is
implementation-specific (and may not be portable).

这个结果是实现定义的建议并不让我感到惊讶,但我听说cplusplus.com并不总是可靠的。

最后,当从32位整数到16位整数执行相同的转换(同样具有16位范围的值)时,我看到结果清楚地表明整数溢出。虽然我对此并不感到惊讶,但由于与float类型的演员表不一致而增加了我的困惑。

我无法访问C ++标准,但是这里有很多C ++人员这样做我想知道标准在这个问题上说了些什么?为了完整起见,我使用的是g ++版本4.6.3。

1 个答案:

答案 0 :(得分:8)

你对你读过的内容提出质疑是正确的。转换没有明确的行为,这与您在问题中引用的内容相矛盾。

  

4.9浮动积分转换[conv.fpint]

     

1浮点类型的prvalue可以转换为整数类型的prvalue。转换截断;   也就是说,丢弃小数部分。如果截断值不能,则行为未定义   以目的地类型表示。 [注意:如果目的地类型为bool,请参阅4.12。 - 结束记录]

您可能获得的一个可能有用的允许结果是崩溃。