簡體   English   中英

將Float轉換為Int32,負數失敗,C

[英]Converting Float to Int32, with negative numbers fails, C

我有以下函數,假設將浮點數轉換為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;
}

你可以在這里看到原因: 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或類似的!

編譯器分兩個階段解析“-2147483648”:文本到數字,然后是否定。

2147483648可能是unsigned long/unsigned值。 否定不會改變類型並奇怪地保留相同的無符號整數值2147483648

因此fNumber >= MinInt32是有signed / unsigned比較,它在比較之前將fNumber轉換為無符號整數。

建議使用@Brian Sidebotham解決方案或者如果這是不可接受的,至少將MinInt32轉換為其預期的類型。

#define MinInt32 ((int32)-2147483648)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM