【问题标题】:Converting Float to Int32, with negative numbers fails, C将浮点数转换为 Int32,负数失败,C
【发布时间】:2015-06-02 08:14:02
【问题描述】:

我有以下函数,假设将浮点数转换为 int32。问题是对于负数它不起作用(我的 if 语句没有执行)。我尝试了一个类似的程序来将浮点数转换为 int16,一切正常。对不起,如果这太简单了,但我无法弄清楚我错过了什么以及为什么它不适用于负值。

#define MaxInt32 2147483647
#define MinInt32 -2147483648
…
bool CastFloatToInt32 ( float  fNumber, int32 *ConvertedValue) {
    bool CastStatus = False;

    if ( ( fNumber >= MinInt32 ) && ( fNumber <= MaxInt32 ) ) {
        *ConvertedValue = ( int32 ) ( fNumber );
        CastStatus = True;

    } else {
        if (fNumber < MinInt32) {
            *ConvertedValue = MinInt32;

        } else {
            *ConvertedValue = MaxInt32;
        }
    }

    return CastStatus;
}

【问题讨论】:

  • 这可能是涉及符号位的问题吗?
  • 您没有使用floor()ceil()的任何原因?
  • 请注意,fNumber &lt;= MaxInt32 等价于 fNumber &lt;= (float)MaxInt32,其中将 MaxInt32 转换为 float 会循环向上。对于fNumber 2^31 的值,条件为真,之后的转换( int32 ) ( fNumber ) 将调用未定义的行为。
  • @SouravGhosh 我不清楚您以何种方式建议浮点到浮点函数floorceil 会有用。也许您应该在答案中扩展此评论。
  • 我认为答案在于 MinInt32MaxInit32 是如何表示为浮点数的,或者这些值一开始可能是错误的。它们是如何定义的?

标签: c floating-point


【解决方案1】:

您可以在这里看到原因:https://stackoverflow.com/a/20910712/1073171

因此,您可以通过将定义更改为以下任一方式来修复此代码:

#define MaxInt32 (int32)0x7FFFFFFF
#define MinInt32 (int32)0x80000000

否则:

#define MaxInt32 (int32)2147483647
#define MinInt32 (int32)(-2147483647 - 1)

我在上面链接的答案中给出了推理。如果您使用的是 GCC,您也可以随时转到 -std=gnu99 或类似地址!

【讨论】:

  • 感谢您的帮助,它解决了我的问题。我非常感激,因为我被困在这两天了。
【解决方案2】:

编译器分两个阶段解析“-2147483648”:文本到数字,然后取反。

2147483648 可能是 unsigned long/unsigned 值。否定不会改变类型并且奇怪地保留2147483648的相同无符号整数值。

因此fNumber &gt;= MinInt32signed / unsigned 比较,它在比较之前将fNumber 转换为无符号整数。

建议使用@Brian Sidebotham 解决方案,或者如果这不可接受,至少将MinInt32 转换为其预期类型。

#define MinInt32 ((int32)-2147483648)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多