C++ 这段代码做什么:静态联合MSVC_邪恶_浮动_HACK无穷大_HACK={{0x00,0x00,0x80,0x7F};

C++ 这段代码做什么:静态联合MSVC_邪恶_浮动_HACK无穷大_HACK={{0x00,0x00,0x80,0x7F};,c++,C++,我目前正在开始使用花栗鼠物理引擎,并在头文件中找到了它 INFINITY用于设置对象的无限动量,但我不明白上面的代码是做什么的 上面的代码有效地定义了一个浮点常量,其中包含一些非常特定的字节表示形式 每个float都用一组字节表示,但是当您定义float常量时,您必须使用十进制表示,并且不能定义一个值为0xFFFFFF的常量(我不知道该常量是否是合法的float数字) 上面的代码绕过了这个限制-它首先在联合内部设置一个字节数组,然后“访问”相同的字节数组,就好像它是一个浮点数一样。顺便说一句,这

我目前正在开始使用花栗鼠物理引擎,并在头文件中找到了它


INFINITY用于设置对象的无限动量,但我不明白上面的代码是做什么的

上面的代码有效地定义了一个浮点常量,其中包含一些非常特定的字节表示形式

每个
float
都用一组字节表示,但是当您定义
float
常量时,您必须使用十进制表示,并且不能定义一个值为
0xFFFFFF
的常量(我不知道该常量是否是合法的
float
数字)


上面的代码绕过了这个限制-它首先在联合内部设置一个字节数组,然后“访问”相同的字节数组,就好像它是一个
浮点数一样。顺便说一句,这是非法的-只有以前设置的union成员可以合法访问,但它可能在该特定实现上工作。

它将无穷大设置为十六进制位0x7f800000表示的浮点值,即
+INF
。Visual Studio由于某些原因没有定义无穷大。

这是一种将浮点变量占用的内存初始化为0x7f800000的方法。正如@Jim所说,这是浮点中的+无穷大

代码大致相当于:

#ifndef INFINITY
#ifdef _MSC_VER
    union MSVC_EVIL_FLOAT_HACK
    {
        unsigned __int8 Bytes[4];
        float Value;
    };
    static union MSVC_EVIL_FLOAT_HACK INFINITY_HACK = {{0x00, 0x00, 0x80, 0x7F}};
    #define INFINITY (INFINITY_HACK.Value)
#endif
首先,原始代码定义了一个联合,允许您将四个字节的内存作为四个字节的数组或单个浮点(我们假设它也占用四个字节)进行操作:

然后,它分配一个名为
INFINITY\u HACK
的联合实例,并将其
Bytes
数组的值设置为指定的十六进制值:

union MSVC_EVIL_FLOAT_HACK
    {
        unsigned __int8 Bytes[4];
        float Value;
    };
这具有初始化浮点值字段的效果,因为它还占用与字节数组相同的内存


最后,它定义了一个名为
INFINITY的前处理器常量作为浮点值。

它创建了一个MSVC\u EVIL\u float\u HACK类型的变量INFINITY\u HACK。它将字节数组设置为具有相应十六进制值的值。然后,它将这些字节转换为浮点数(union仅允许您通过引用使用so中的一个基础值。值它将INIFITY_HACK指向的数据转换为浮点数),方法是按照二进制->浮点数转换(请注意,字节取反)

如果你不知道它是如何工作的,有一个很好的小计算器可以解释它:
(如果你输入7F800000,你会得到无穷大,但是试着输入4048F5C2(你会接近3.14)会变成十进制->十六进制。

此外,它是以相反的顺序声明的{0x00,0x00,0x80,0x7F},因为x86使用小尾端。你的答案中是
+/-INF
,因为我很确定位模式就是
+INF
:-)没关系,我自己来修。我不能容忍有这么多选票的错误答案:-)
union MSVC_EVIL_FLOAT_HACK
    {
        unsigned __int8 Bytes[4];
        float Value;
    };
static union MSVC_EVIL_FLOAT_HACK INFINITY_HACK = {{0x00, 0x00, 0x80, 0x7F}};