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