将带有负数的 Float 转换为 Int32 失败,C
Converting Float to Int32, with negative numbers fails, C
我有以下函数,假设将浮点数转换为 int32。问题是对于负数它根本不起作用(我的 if 语句没有执行)。我已经尝试了一个类似的程序,用于从 float 到 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;
}
你可以在这里看到原因:
因此,您可以通过将定义更改为以下之一来修复此代码:
#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
转换为无符号整数。
建议使用 解决方案,如果不能接受,至少将 MinInt32
转换为预期类型。
#define MinInt32 ((int32)-2147483648)
我有以下函数,假设将浮点数转换为 int32。问题是对于负数它根本不起作用(我的 if 语句没有执行)。我已经尝试了一个类似的程序,用于从 float 到 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;
}
你可以在这里看到原因:
因此,您可以通过将定义更改为以下之一来修复此代码:
#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
转换为无符号整数。
建议使用 MinInt32
转换为预期类型。
#define MinInt32 ((int32)-2147483648)