是否在C标准中定义了对unsigned int的负二次转换行为?

时间:2012-05-10 19:54:28

标签: c casting

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

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. 

1 个答案:

答案 0 :(得分:26)


此转换未定义,因此无法移植。

C99 / C11 6.3.1.4

  

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

根据C11 6.3.1.4脚注61:

  

当实数浮点类型的值转换为无符号类型时,无需执行将整数类型的值转换为无符号类型时执行的剩余操作。因此,便携式实际浮动值的范围是(-1,Utype_MAX + 1)。