gpt4 book ai didi

c++ - C++ 标准对超出目标类型范围的类型的强制转换结果有何规定?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:37 24 4
gpt4 key购买 nike

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

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

// si_val is now -32768

这个输入值是个问题,在我的代码中我忽略了检查浮点值的限制,所以我可以看到我的错误,但这让我想知道当必须这样做时语言的确切规则笨拙的 Actor 。我有点惊讶地发现类型转换的值(value)是-32768。此外,这是我在 float 的值超过 16 位整数的限制时得到的值。我用谷歌搜索了这个,但令人惊讶地发现缺乏关于它的详细信息。我能找到的最好的是来自 cplusplus.com 的以下内容

Converting to int from some smaller integer type, or to double from float is known as promotion, and is guaranteed to produce the exact same value in the destination type. Other conversions between arithmetic types may not always be able to represent the same value exactly:

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 版。

最佳答案

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

4.9 Floating-integral conversions [conv.fpint]

1 A prvalue of a floating point type can be converted to a prvalue of an integer type. The conversion truncates; that is, the fractional part is discarded. The behavior is undefined if the truncated value cannot be represented in the destination type. [ Note: If the destination type is bool, see 4.12. -- end note ]

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

关于c++ - C++ 标准对超出目标类型范围的类型的强制转换结果有何规定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20421300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com