在C++中用浮点文字初始化整数数组的成员

在C++中用浮点文字初始化整数数组的成员,c++,arrays,initializer-list,C++,Arrays,Initializer List,我有一个32位长整数数组。一些元素随后将用作32位浮点。我想提供一个初始化列表来正确初始化这些浮点值。例如,如果前两个元素用作整数,第三个元素用作浮点,并且我希望将第三个元素初始化为等于100.0,则我必须执行以下操作: long a[3]={10,20,0x42c80000}; 这很好,但不是很有表现力 如果我这样做: long a[3]={10,20,100.0}; 编译器将浮点文本转换为0x64 我没有C++11编译器,因此使用union将不起作用 有什么想法吗?工会不需要C++11,

我有一个32位长整数数组。一些元素随后将用作32位浮点。我想提供一个初始化列表来正确初始化这些浮点值。例如,如果前两个元素用作整数,第三个元素用作浮点,并且我希望将第三个元素初始化为等于100.0,则我必须执行以下操作:

long a[3]={10,20,0x42c80000};
这很好,但不是很有表现力

如果我这样做:

long a[3]={10,20,100.0};
编译器将浮点文本转换为0x64

我没有C++11编译器,因此使用union将不起作用


有什么想法吗?

工会不需要C++11,所以请继续使用它们。然而,如果不同类型的对象/元素在语义上不属于一起,那么在单个数据结构中混合这些对象/元素通常是一个坏主意


这将使您处理所述数据结构的代码变得脆弱且容易出错。我建议重新考虑语义,看看为什么需要在同一个数组中同时使用long和float。它们可以存储在单独的数据结构中。此外,浮点可以准确地存储所有长字符,尽管按位表示方式不同,那么为什么不创建一个浮点数组呢?

联合不需要C++11,所以继续使用它们。然而,如果不同类型的对象/元素在语义上不属于一起,那么在单个数据结构中混合这些对象/元素通常是一个坏主意


这将使您处理所述数据结构的代码变得脆弱且容易出错。我建议重新考虑语义,看看为什么需要在同一个数组中同时使用long和float。它们可以存储在单独的数据结构中。此外,浮点可以准确地存储所有长数组,尽管按位表示方式不同,那么为什么不创建一个浮点数组作为开始呢?

当您将其分配给长数组时,它将执行隐式转换。如果要在变量中存储字节值,可以使用memcpy

所以,如果你的类型大小不一样,你可以做什么并注意到这是非常危险的,因为你有这样一个函数

long toLongRepresantation(float f)
{
   long ret;
   memcpy(&ret,&f,sizeof(long));
   return ret;
}

您也可以对此设置模板,但应确保两种类型的大小相同。

将其指定给长数组时,将执行隐式转换。如果要在变量中存储字节值,可以使用memcpy

所以,如果你的类型大小不一样,你可以做什么并注意到这是非常危险的,因为你有这样一个函数

long toLongRepresantation(float f)
{
   long ret;
   memcpy(&ret,&f,sizeof(long));
   return ret;
}

您也可以将其模板化,但应确保两种类型的大小相同。

为什么不使用struct或class

struck a
{
    int    iValue1; 
    float  fValue1;
    double dValue1;
    char   cValue1;

    int    iValue2[10]; // array of ints
    float  fValue2[5 ]; // array of floats
    // ...
};

为什么不使用struct或class呢

struck a
{
    int    iValue1; 
    float  fValue1;
    double dValue1;
    char   cValue1;

    int    iValue2[10]; // array of ints
    float  fValue2[5 ]; // array of floats
    // ...
};

如何区分前2个值应解释为int,第3个值应解释为double?如果问题只是代码的读者很容易理解0x42C80000表示100.0的单精度浮点值,那么如何定义浮点\u 100 0x42C80000,然后将其放入数组中?如何区分前2个值应解释为int,第3个值应解释为double?如果问题只是代码读者容易理解0x42C80000表示100.0的单精度浮点值,那么如何定义浮点值_100 0x42C80000,然后将其放入数组中?这在sizeoffloat时具有UB允许我做我想做的,而不是讨论这种类型的编程是否糟糕。浮点数组也有同样的问题,相反…它接受我的整数值并将它们转换为浮点格式。我真正想问的是,是否有任何方法可以在编译时初始化常量整数数组以包含值{10,20,0x42c80000}但是,以这样一种方式,代码的读者将很容易理解0x42C80000表示100.0的单精度浮点值。数组必须在编译时初始化…它是编程到闪存的一组常量…因此我无法在运行时执行。在C++ 11之前,它的第一个成员只能初始化它,所以它不允许我将元素初始化为浮点。在一个结构中放置不同的数据类型是非常合理的原因…这就是为什么C++语言中有联盟的原因。数据的每个用户都知道它的功能,而且它根本不容易出错。我的问题是C++是否允许我做什么,而不是讨论这种编程是否坏。浮点数组在反向中有同样的问题…它取我的整数值并将它们转换成浮点格式。我真正想问的是,是否有任何方法可以在编译时初始化常量整数数组,以包含值{10,20,0x42c80000},但这样代码的读者就会很容易理解0x42c80000表示100.0的单精度浮点值。