我有在不同平台上运行的代码,似乎得到不同的结果。我正在寻找一个适当的解释。
我希望 cast to对 1或对1unsigned
起作用。float
double
int
窗户:
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 补码机器上执行我们所期望的操作,并保持位模式不变。