C++ 指向浮点的短指针

C++ 指向浮点的短指针,c++,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;

我用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;
}
#包括
使用名称空间std;
int main()
{
浮动f=7.0;
短s=*(短*)&f;

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

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


话虽如此,您看到的数字之所以有效,可能有一些原因,但除非您明确知道您的平台将实现您期望的功能,否则您不能依赖它,因为它不受标准的保障。

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

因为float的值是7,所以它只占用右边一些最低有效位(我假设是big-endian)

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

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

不过,我相信,这个结果是非常复杂的,在不同的平台、编译器等上可能会有所不同。

静态void位打印(float f)
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;
}
{ 断言(sizeof(int)=sizeof(float)); int*data=重新解释铸件(&f); 对于(int i=0;i 然而,考虑到短文的表示可以是大端或小端,我就不那么确定了。无论如何,这是一个50分钟演讲结束时的一句废话,所以我们可以原谅他一点。可能是他在下一次演讲中带着澄清回来了


您至少需要检查底层位(至少)一个字节一个字节的级别来理解发生了什么。

他似乎假设这是UB。所以任何包括0的东西都可能是UB?它只是依赖于平台。任何其他的都可以。@innochenti-严格的别名规则,UB使用一种类型存储数据,访问它时使用指向不同类型的指针,除了一些特殊类型不,我是说,C++中的UB使用一个指向短的指针来访问声明为包含浮点的内存。对齐方式是不相关的。它可能对大多数编译器很有效,但不允许使用指针指向另一类型的内存,并希望它在C++中工作(除了少数例外)。如果您有C++11编译器,请使用static_assert检查类型的大小。
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;
}