当未定义的行为时,将double转换为整数

时间:2015-06-15 17:36:56

标签: c++ c

所以关注:

$file_type =  mime_content_type($_FILES['img']['tmp_name']);

if($file_type == 'text/plain'){
    echo "file type is text";
}
?>

<form action="#" method="post" enctype="multipart/form-data">
  <input type="file" name="img">
  <input type="submit" value="Submit">
</form>

不是未定义的行为,因为244可以放在double t = 244.233; int a = (int) t; 里面我做对了吗? 否则,如果它是较大的值而不是244不适合int内部,这将是未定义的,我是否做对了?

我对C如何做到这一点更感兴趣。但在这种情况下,是否存在与C ++相同的区别?

3 个答案:

答案 0 :(得分:6)

来自[conv.fpint]:

  

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

因此,例如,将66666.66转换为int16_t将是未定义的行为,但转换66.66就好了。

答案 1 :(得分:5)

来自我最喜欢的documentation

  

浮点类型的prvalue可以转换为任何整数类型的prvalue。小数部分被截断,即,小数部分被丢弃。 如果值无法适应目标类型,则行为未定义(即使目标类型未签名,模运算也不适用)。

是的,你是对的。 (对于C ++,但有人已经为C发布了几乎相同的标准报价

答案 2 :(得分:3)

如果整数部分不能用整数类型表示,则在C中有未定义的行为。

  

(C11,6.3.1.4p1)   “当实数浮点类型的有限值转换为_Bool以外的整数类型时,小数部分被丢弃(即,该值被截断为零)。如果整数部分的值不能用整数类型表示,行为未定义.61“

C ++中的类似写法,C ++ 11,4.9p1。