C ++ 11 4.9浮动积分转换[conv.fpint]:
浮点类型的prvalue可以转换为整数类型的prvalue。转换截断;也就是说,丢弃小数部分。如果截断的值无法在目标类型中表示,则行为未定义。
如果值为-0.0
,是否定义了行为?它归结为“截断值是否无法在目标类型中表示”。零可以代表。可以负零吗?在这种情况下,两个零值是区分还是不区分?
答案 0 :(得分:11)
-0.0
的截断值为0
,可在整数类型(包括无符号整数类型)中表示。我没有理由认为-0.0
和0.0
的截断值不同,只是-0.25
和0.3
的截断值不同。
答案 1 :(得分:-1)
C11§6.2.6.2/ 3
如果实现支持负零,则只能通过以下方式生成:
- &,|,^,〜,<<<>>具有产生这种值的操作数的运算符;
- +, - ,*,/和%运算符,其中一个操作数为负零,结果为 零;
- 基于上述情况的复合赋值算子。
未指明这些案例是否实际产生负零或正常零, 以及当存储在对象中时,负零是否变为正常零。
所以我会说unsigned(-0.0)
会产生0
。至少在C。