代码之家  ›  专栏  ›  技术社区  ›  matt

iphone:float cast to unsigned int如果为负数,则设置为0?

  •  7
  • matt  · 技术社区  · 16 年前

    试一试:

    volatile float bob = -344.0f;
    unsigned int fred = (unsigned int)bob;
    
    printf("%d\n",fred);
    

    输出将为0。

    显然,我希望它能像从一个带符号的int转换为一个未设计的int一样被包装起来(它确实像iphone上所期望的那样包装和操作)

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

    有什么想法吗?

    4 回复  |  直到 13 年前
        1
  •  11
  •   Paul R    13 年前

    这是意料之中的-将负浮点值转换为无符号int会导致未定义行为(ub)。如果你想把这个值包装起来(也就是ub,btw),那么你需要先转换成一个(有符号的)int,然后再转换成无符号的int。理想情况下,你根本不应该依赖ub,找到一个更好的方法来做你需要做的事情。

        2
  •  4
  •   Stephen Canon    16 年前

    C标准第6.3.1.4条:

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

    如此喜欢 保罗R 说,这是不确定的行为。

        3
  •  0
  •   Andy J Buchanan    16 年前

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

        4
  •  0
  •   DigitalRoss    14 年前

    此转换未定义,因此不可移植。

    根据C99第6.3.1.4条脚注50:

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

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