【发布时间】:2015-06-02 08:14:02
【问题描述】:
我有以下函数,假设将浮点数转换为 int32。问题是对于负数它不起作用(我的 if 语句没有执行)。我尝试了一个类似的程序来将浮点数转换为 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;
}
【问题讨论】:
-
这可能是涉及符号位的问题吗?
-
请注意,
fNumber <= MaxInt32等价于fNumber <= (float)MaxInt32,其中将MaxInt32转换为float会循环向上。对于fNumber2^31 的值,条件为真,之后的转换( int32 ) ( fNumber )将调用未定义的行为。 -
@SouravGhosh 我不清楚您以何种方式建议浮点到浮点函数
floor和ceil会有用。也许您应该在答案中扩展此评论。 -
我认为答案在于
MinInt32和MaxInit32是如何表示为浮点数的,或者这些值一开始可能是错误的。它们是如何定义的?
标签: c floating-point