指向浮点的短指针

时间:2012-08-14 07:41:56

标签: c++

我在c ++中运行此代码:

#include <iostream>
using namespace std;
int main()
{
    float f = 7.0;
    short s = *(short *)&f;
    cout << sizeof(float) << endl
         << sizeof(short) << endl
         << s << endl;
    return 0;
}

我得到了以下的底池:

4
2
0
但是,在斯坦福大学的一次演讲中,杰里·凯恩教授表示,他确信外出不会为0。

讲座可以很喜欢here。他说大约48分钟。

他错了,还是有些标准改变了?平台之间是否存在差异?
我正在使用g ++来编译我的代码
编辑:在下一个讲座中,他确实提到了“大端”和“小端”,并说它们很好地影响了结果。

4 个答案:

答案 0 :(得分:4)

static void bitPrint(float f)
{
    assert(sizeof(int) == sizeof(float));
    int *data = reinterpret_cast<int*>(&f);
    for (int i = 0; i < sizeof(int) * 8; ++i)
    {
        int bit = (1 << i) & *data;
        if (bit) bit = 1;
        cout << bit;
    }
    cout << endl;
}

int main()
{
    float f = 7.0;
    bitPrint(f);
    return 0;
}

此程序打印00000000000000000000011100000010

由于您平台上的sizeof(short) == 2,您将得到前两个字节,它们都是零

请注意,由于类型的大小和可能的浮点实现(不确定)是实现定义的,因此可以在不同的平台上看到不同的输出。

答案 1 :(得分:2)

嗯,让我们看看。首先,你将浮点数写入内存。它占用4个字节,它的值为7.内存中的浮点看起来像“符号位 - >指数位 - >尾数位”。我不确定每个部件到底有多少位,这可能取决于你的平台。

由于float的值为7,它只占用右边的一些最低有效位(我假设为big-endian)。

您的short指针指向浮点的开头,这意味着最重要的位。由于该值大于0,因此符号位为零。由于浮点值远在右侧,我们可以说这两个最重要的字节用零填充。

现在,假设short的大小为2,这意味着我们只从float的4个字节中取出两个字节,我们得到0

我相信,这个结果相当于UB,并且可以在不同的平台,编译器等上有所不同。

答案 2 :(得分:1)

通过指向与存储的不同类型的指针访问数据(除少数特殊情况除外)未定义的行为。

首先,它的平台依赖于它所存储的数据,因此不同的系统可能会给出不同的值,其次,编译器可能会生成甚至看不到您期望的值的代码,因为它允许做任何它喜欢的事情。你这样做(由于严格的别名规则,它是未定义的行为)。

虽然说你看到的号码有效的原因可能是有原因的,但你不能依赖它,除非你明确知道你的平台能达到预期的效果,否则它不会受到标准的保护。

答案 3 :(得分:0)

他“非常”确定它不是零,他明确地说。

然而,鉴于短线的表示可以是大端或小端,我不会那么肯定。无论如何,这是一个五十分钟讲座结束时的一次性线,所以我们可以原谅他一点。可能是他在下一个讲座中回来并作了澄清。

您需要在(至少)逐字节级别检查基础位,以了解正在发生的事情。