我想知道是否有人可以为我所解决的问题设定正确的方向。我正在尝试仅使用ARM汇编和位操作来完成以下C函数的工作:
int float2int(float x) {
return (int) x;
}
我已经编写了与此相反的代码(int2float),没有很多问题。我只是不确定从哪里开始这个新问题。
例如:
3 (int) = 0x40400000 (float)
0011 = 0 10000000 10000000000000000000000
其中0是符号位,10000000是指数,10000000000000000000000是尾数/分数。
有人可以简单地指出我这个问题的正确方向吗?甚至C伪代码表示形式也会有所帮助。我知道我需要提取符号位,提取指数并逆转偏差(127)并提取分数,但是我不知道从哪里开始。
还有一个问题,如果浮点数不能表示为整数(因为它溢出或为NaN)。
任何帮助,将不胜感激!
最佳答案
// Assume int can hold all the precision of a float.
int float2int(float x) {
int Sign = f_SignRawBit(x);
unsigned Mantissa = f_RawMantissaBits(x); // 0 - 0x7FFFFF
int Expo = f_RawExpoBits(x); // 0 - 255
// Form correct exponent and mantissa
if (Expo == EXPO_MAX) {
Handle_NAN_INF();
}
else if (Expo == EXPO_MIN) {
Expo += BIAS + 1 - MantissaOffset /* 23 */;
}
else {
Expo += BIAS - MantissaOffset /* 23 */;
Mantissa |= ImpliedBit;
}
while (Expo > 0) {
Expo--;
// Add code to detect overflow
Mantissa *= 2;
}
while (Expo < 0) {
Expo++;
// Add code to note last shifted out bit
// Add code to note if any non-zero bit shifted out
Mantissa /= 2;
}
// Add rounding code depending on `last shifted out bit` and `non-zero bit shifted out`. May not be need if rounding toward 0.
// Add code to detect over/under flow in the following
if (Sign) {
return -Mantissa;
}
return Mantissa;
}
关于c - 仅使用按位操作将float转换为int(float2int),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20318911/