[英]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.