将Float转换为Int32,负数失败,C

时间:2015-06-02 08:14:02

标签: c floating-point

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

#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;
}

2 个答案:

答案 0 :(得分:2)

您可以在此处查看原因: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或类似的地方!

答案 1 :(得分:1)

编译器解析&#34; -2147483648&#34;在两个阶段:文本到数字然后否定。

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

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

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

#define MinInt32 ((int32)-2147483648)