iphone:浮动转换为无符号整数如果它们是负数则设置为0?

时间:2010-03-22 07:40:54

标签: iphone casting floating-point

尝试一下:

volatile float bob = -344.0f;
unsigned int fred = (unsigned int)bob;

printf("%d\n",fred);

输出为0。

显然我希望它能够像我从一个已签名的int转换为一个未编译的int(它会在iphone上进行换行并按预期运行)来进行环绕。

我们假设它与浮点设置有关。

任何想法?

4 个答案:

答案 0 :(得分:11)

这是预期的 - 将负浮点数转换为unsigned int会导致未定义的行为(UB)。如果你想让值环绕(也就是UB,BTW),那么你需要首先转换为(signed)int,然后转换为unsigned int。理想情况下,你根本不应该依赖UB,找到一种更好的方法来做你需要做的事情。

答案 1 :(得分:4)

C标准的§6.3.1.4:

  

当有限值真实浮动时   type转换为整数类型   除了_Bool,小数部分   被丢弃(即,值是   截断为零)。如果值   不可能是整体部分   由整数类型表示,   行为未定义。

所以像 Paul R 所说,这是未定义的行为。

答案 2 :(得分:0)

通过签名的int进行投射。

答案 3 :(得分:0)

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

根据C99§6.3.1.4脚注50:

  

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

鉴于已知此转换不是可移植的,因此返回0而非随机特定转换是非常合理的解释。这至少有两个原因:(1)标记非可移植代码而不是传播它,(2)只是丢弃符号与转换整数类型的相同值时发生的情况大不相同,所以它是不清楚任何特定的选择是一个更好的主意。