【发布时间】:2011-12-13 11:36:23
【问题描述】:
我写这篇文章是因为我真的不知道为什么会这样。我知道如何纠正它/绕过它,但我想知道发生这种情况的原因。我正在使用 C,我的编译器是在 Intel 机器上运行的 gcc 4.4.1 (TDM)。
关于浮点数的假设: -符合 IEEE 754 标准 - 以 Big Endian 方式存储
假设我们有一个函数接收 4 个字节的数组并将它们作为浮点数返回。这就是函数的目标。我们还假设,例如,所有函数都会以“正确的顺序”获取字节,并且由于系统是小端的,它只会交换它们并将它们放入浮点数以返回一个值。为简单起见,我不包括对 NaN 或 INF 的任何检查,因为这不是本问题的目的。
float testFunction(char* arr)
{
//this will be the float we return
float ret;
//let's just get a char pointer to the float so we can alter its byte values
char* c = (char*)&ret;
//just swap them so they conform with little endian byte order
c[0] = arr[3];
c[1] = arr[2];
c[2] = arr[1];
c[3] = arr[0];
//up to here if you debug and watch ret's value it is correct as it is supposed to be
return ret;
}
问题在于我在哪里使用该功能......让我们说如下
float f = testFunction(arr);
那么浮点 f 与您作为参数传递的字节具有完全无关的浮点值。
成功解决这个问题的方法是声明一个接受浮点数作为参数的函数,并在函数内部给它一个值,如下所示:
void testFunction(char* arr,float* f)
{
char* c = ((char*)f)
c[0] = arr[3];
c[1] = arr[2];
c[2] = arr[1];
c[3] = arr[0];
}
但我的问题仍然是,为什么当我尝试返回值时会发生这种情况?我确实理解 float ret 是函数范围内的临时值,但 return 语句应该将其值复制到函数之外。这不是正确的吗? 我错过了什么?我想这一定很明显。
【问题讨论】:
-
您传入的是什么字节数组以及您期望的
float值是多少? -
如果我们认为
float是 32 位(而char是 8 位),那么您所做的是正确的。 -
@Charles:任何字节数组,我希望浮点数符合 IEEE 754 标准。只需使用任何转换器来查看您必须以字节形式给出的内容以及您应该期望的浮点数。一个非常好的在这里:h-schmidt.net/FloatApplet/IEEE754.html
-
我试过你的测试功能,它对我来说没问题。至少我提供给函数的字节和返回的浮点值是相同的并且具有正确的顺序。因此,请尝试在您的机器上逐字节打印返回值。
-
@Lefteris 所以
arr是BigEndian,对吧?因为如果它已经是LittleEndian,则不需要交换。