我有以下函数,假设将浮点数转换为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;
}
答案 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 >= MinInt32
是signed
/ unsigned
比较,在比较之前将fNumber
转换为无符号整数。
建议使用@Brian Sidebotham解决方案,或者如果不接受,至少将MinInt32
转换为预期的类型。
#define MinInt32 ((int32)-2147483648)