在C ++中是否定义了无符号(-0.0)的行为?

时间:2013-06-21 00:01:14

标签: c++ floating-point type-conversion language-lawyer

C ++ 11 4.9浮动积分转换[conv.fpint]:

  

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

如果值为-0.0,是否定义了行为?它归结为“截断值是否无法在目标类型中表示”。零可以代表。可以负零吗?在这种情况下,两个零值是区分还是不区分?

2 个答案:

答案 0 :(得分:11)

-0.0的截断值为0,可在整数类型(包括无符号整数类型)中表示。我没有理由认为-0.00.0的截断值不同,只是-0.250.3的截断值不同。

答案 1 :(得分:-1)

C11§6.2.6.2/ 3

  

如果实现支持负零,则只能通过以下方式生成:

     

- &,|,^,〜,<<<>>具有产生这种值的操作数的运算符;

     

- +, - ,*,/和%运算符,其中一个操作数为负零,结果为   零;

     

- 基于上述情况的复合赋值算子。

     

未指明这些案例是否实际产生负零或正常零,   以及当存储在对象中时,负零是否变为正常零。

所以我会说unsigned(-0.0)会产生0。至少在C。