26

我有在不同平台上运行的代码,似乎得到不同的结果。我正在寻找一个适当的解释。

我希望 cast to对 1或对1unsigned起作用。floatdoubleint

窗户:

double dbl = -123.45; 
int d_cast = (unsigned int)dbl; 
// d_cast == -123

WinCE (ARM):

double dbl = -123.45; 
int d_cast = (unsigned int)dbl; 
// d_cast == 0

编辑:

感谢您指出正确的方向。

修复解决方法

double dbl = -123.45; 
int d_cast = (unsigned)(int)dbl; 
// d_cast == -123
// works on both. 

脚注 1:编者注:将超出范围的unsigned值转换为有符号类型,如int实现定义(不是未定义)。C17 § 6.3.1.3 - 3。

因此,对于最终在某些特定实现上具有巨大积极价值d_cast的情况,标准也没有确定对的分配。(unsigned)dbl(该执行路径包含 UB,因此理论上 ISO C 已经不在了)。在实践中,编译器在正常的 2 补码机器上执行我们所期望的操作,并保持位模式不变。

4

1 回答 1

31


这种转换是未定义的,因此不可移植。

C99/C11 6.3.1.4

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

根据 C11 6.3.1.4 脚注 61:

将整数类型的值转换为无符号类型时执行的求余运算不需要在将实浮点类型的值转换为无符号类型时执行。因此,可移植实浮点值的范围是(-1,Utype_MAX+1)。

于 2012-05-10T19:59:32.650 回答