我的代码在不同的平台上运行,似乎得到了不同的结果。我正在寻找一个正确的解释。
Windows:
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.
答案 0 :(得分:26)
此转换未定义,因此无法移植。
C99 / C11 6.3.1.4
当实数浮点类型的有限值转换为_Bool以外的整数类型时, 丢弃小数部分(即,该值被截断为零)。如果值 整数部分不能用整数类型表示,行为是未定义的。
根据C11 6.3.1.4脚注61:
当实数浮点类型的值转换为无符号类型时,无需执行将整数类型的值转换为无符号类型时执行的剩余操作。因此,便携式实际浮动值的范围是(-1,Utype_MAX + 1)。