尝试一下:
volatile float bob = -344.0f;
unsigned int fred = (unsigned int)bob;
printf("%d\n",fred);
输出为0。
显然我希望它能够像我从一个已签名的int转换为一个未编译的int(它会在iphone上进行换行并按预期运行)来进行环绕。
我们假设它与浮点设置有关。
任何想法?
答案 0 :(得分:11)
这是预期的 - 将负浮点数转换为unsigned int会导致未定义的行为(UB)。如果你想让值环绕(也就是UB,BTW),那么你需要首先转换为(signed)int,然后转换为unsigned int。理想情况下,你根本不应该依赖UB,找到一种更好的方法来做你需要做的事情。
答案 1 :(得分:4)
当有限值真实浮动时 type转换为整数类型 除了_Bool,小数部分 被丢弃(即,值是 截断为零)。如果值 不可能是整体部分 由整数类型表示, 行为未定义。
所以像 Paul R 所说,这是未定义的行为。
答案 2 :(得分:0)
通过签名的int进行投射。
答案 3 :(得分:0)
此转换未定义,因此无法移植。
根据C99§6.3.1.4脚注50:
当实数浮点类型的值转换为无符号类型时,无需执行将整数类型的值转换为无符号类型时执行的剩余操作。因此,便携式实际浮动值的范围是(-1,Utype_MAX + 1)。
鉴于已知此转换不是可移植的,因此返回0而非随机特定转换是非常合理的解释。这至少有两个原因:(1)标记非可移植代码而不是传播它,(2)只是丢弃符号与转换整数类型的相同值时发生的情况大不相同,所以它是不清楚任何特定的选择是一个更好的主意。