C iphone:float强制转换为无符号整数,如果为负数,则设置为0?

C iphone:float强制转换为无符号整数,如果为负数,则设置为0?,c,iphone,casting,floating-point,type-conversion,C,Iphone,Casting,Floating Point,Type Conversion,试一试: volatile float bob = -344.0f; unsigned int fred = (unsigned int)bob; printf("%d\n",fred); 输出将为0 很明显,我希望它能像我从一个有符号的int转换成一个无符号的int(在iphone上确实能像预期的那样进行包装和操作) 我们假设这与浮点设置有关 有什么想法吗?这是意料之中的-将负浮点值转换为无符号整数会导致未定义行为(UB)。如果您希望将值进行概括(顺便说一句,它也是UB),那么您需要先将其

试一试:

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

printf("%d\n",fred);
输出将为0

很明显,我希望它能像我从一个有符号的int转换成一个无符号的int(在iphone上确实能像预期的那样进行包装和操作)

我们假设这与浮点设置有关


有什么想法吗?

这是意料之中的-将负浮点值转换为无符号整数会导致未定义行为(UB)。如果您希望将值进行概括(顺便说一句,它也是UB),那么您需要先将其转换为(有符号的)int,然后再转换为无符号的int。理想情况下,您不应该完全依赖UB,而应该找到更好的方法来完成您需要做的事情。

通过有符号的int进行转换。

C标准第6.3.1.4节:

当实浮点数为有限值时 类型转换为整数类型 除了_Bool,分数部分 被丢弃(即,该值为 向零截断)。如果值 不可分割部分的 由整数类型表示,即 行为是未定义的


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

这种转换是未定义的,因此不可移植

根据C99§6.3.1.4脚注50:

整数类型的值转换为无符号类型时执行的余数运算,在实浮点类型的值转换为无符号类型时不需要执行。因此,可移植实浮点值的范围是(−1,Utype_MAX+1)


考虑到这种转换是不可移植的,返回0是一种合理的解释,而不是一种随机的特定转换。这至少有两个原因:(1)标记不可移植代码,而不是传播它;(2)删除符号与转换整型的相同值时发生的情况大不相同,因此,目前还不清楚任何特定的替代方案是否是一个更好的主意。

那么为什么VC++或PSP编译器没有问题?@matt:因为你依赖的是未定义的behaviour@matt:如果您希望int为0,这在那些编译器上是一个问题,这与希望int为0一样合理。这就是未定义行为的问题:你不能合理地期望任何特定的事情发生。它可以环绕,它可以变为0,它可以向你的雇主发送建议性的电子邮件-它完全没有定义它将做什么。@matt,仅仅因为有一个直观的结果并不意味着行为是由标准定义的。特别是,“明显的”转换实际上与有符号整数类型中相同值的转换有很大不同,因此可以肯定地看出为什么实现可能更喜欢返回0,而不是不可移植且可能混淆的结果。无论哪种方式,它都是合理且符合要求的,但有一种方式,它也是不一致的,而不仅仅是没有实现。@KennyTM:一些随机尝试阻止它优化内容。旧线程,但最近我遇到了更多关于这方面的细节。对于XCode 7.2.x,在所有测试的iOS平台上,将负浮点值转换为无符号短值会产生一个环绕值。然而,对于XCode 7.3.1,同样的代码在iPad3上会被截断为零,在iPhone6上会被环绕。这是否回答了你的问题?