C++ 当它未定义行为时,将双值转换为整数

C++ 当它未定义行为时,将双值转换为整数,c++,c,floating-point,undefined-behavior,floating-point-conversion,C++,C,Floating Point,Undefined Behavior,Floating Point Conversion,因此: double t = 244.233; int a = (int) t; 不是未定义的行为,因为244可以放在int中,我做对了吗? 否则,如果它是更大的值,而不是244,它不适合int,这将是未定义的,我得到它了吗 我更感兴趣的是C是如何做到这一点的。但是,在这个案例中,W.R.T与C++相比有什么不同吗?< P>我最喜欢的: 浮点类型的prvalue可以转换为任何整数类型的prvalue。小数部分被截断,即小数部分被丢弃如果该值不适合目标类型,则行为未定义(即使目标类型为无符号,模

因此:

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

我更感兴趣的是C是如何做到这一点的。但是,在这个案例中,W.R.T与C++相比有什么不同吗?

< P>我最喜欢的:

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


是的,你是对的。(对于C++,但是某人已经发布了一个与C相同的标准引用)

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

<> > C++中11的C++相似的措辞,4.9P1.

< P> > [V.F.PNT]:

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

因此,例如,将66666.66转换为
int16\t
将是未定义的行为,但是转换
66.66
就可以了

对于记录,“无法表示”包括NaN。实际上,它不会使您的程序崩溃,但您会得到一个数字,这个数字取决于目标ISA以及编译器如何优化您的代码。从理论上讲,这是UB,所以任何事情都可能发生。